python django
https://mirrors.tuna.tsinghua.edu.cn/help/pypi/ python .\manage.py startapp orgs
sh
通过 django 创建 项目
django-admin startproject 项目名称
django-admin startproject demo
创建一个应用
python .\manage.py startapp app
命令行启动
python .\manage.py runserver
生成 表结构
python .\manage.py makemigrations
python .\manage.py migrate
django admin
python .\manage.py createsuperuser
---------------------------------------
# django部署
www.cnblogs.com/freely/p/8027937.html
先安装 venv 虚拟环境 在虚拟环境中操作
修改settings.py
DEBUG = False
# uwsgi + nginx 访问djangouwsgi.ini
properties
[uwsgi]
socket = 0.0.0.0:8000
chdir = /root/backendmanage
wsgi-file = /root/backendmanage/backendmanage/wsgi.py
home = /root/backendmanage/.venv
master = true
processes = 4
threads = 2
vacum = true
threads = 2
vacum = true
#使进程在后台运行,并将日志打到指定的日志文件
daemonize= /root/backendmanage/uwsgi.log
pidfile=uwsgi.pid相关命令
sh
# 停止
uwsgi --stop uwsgi.pid
# 启动
uwsgi --ini /root/backendmanage/uwsgi.ini
# 重启
uwsgi --reload uwsgi.pid
# 必须关闭 SELINUX=disabled 重启 否则 不生效会有 静态资源403的问题脚本
sh
#!/bin/bash
case "$1" in
"start")
echo "started"
uwsgi --ini /root/backendmanage/uwsgi.ini
;;
"stop")
echo "stop"
uwsgi --stop uwsgi.pid
;;
"restart")
echo "restart"
uwsgi --reload uwsgi.pid
;;
*)
echo "your params is error (start ,stop, restart)"
;;
esac如何导入指定目录的文件
假设你的项目结构如下:
sh
project/
│
├── utils/
│ └── helper.py # 你想导入的文件
│
└── subfolder/
└── main.py # 当前运行的脚本在 main.py 中写入:
python
import sys
import os
# 获取当前文件所在目录的上级目录
parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(parent_dir)
# 现在可以导入上级目录中的模块
import utils.helper # 或者 from utils import helper方式2 推荐现代写法(使用 pathlib,Python 3.4+)
python
import sys
from pathlib import Path
# 将上级目录加入 sys.path
sys.path.append(str(Path(__file__).resolve().parent.parent))
import utils.helpervscode code runner 中文乱码
修改 settings.json .vscode 目录下
sh
{
"terminal.integrated.env.windows": {
"PYTHONIOENCODING": "utf-8",
"LANG": "zh_CN.UTF-8"
},
"code-runner.executorMap": {
"python": "set PYTHONIOENCODING=utf-8 && python -u"
},
"python.terminal.activateEnvironment": false,
"python.terminal.executeInFileDir": true
}脚本 生成sql insert
python
from __future__ import annotations
import datetime as dt
import math
import re
from decimal import Decimal, ROUND_HALF_UP
from pathlib import Path
from typing import Iterable
from openpyxl import load_workbook
from openpyxl.cell.cell import Cell
from openpyxl.styles.numbers import is_date_format
# ====== Configuration: change these values before running ======
EXCEL_PATH = Path(r'dat.xlsx')
SHEET_NAME = "Sheet1"
TABLE_NAME = "sys_user"
OUTPUT_SQL_PATH = Path(r'data.sql')
IGNORE_FIELDS = {
}
# ==============================================================
TEXT_FORMATS = {"@", "text"}
GENERAL_FORMAT = "General"
NUMERIC_SYMBOLS_RE = re.compile(r'"[^"]*"|\[[^\]]*\]|_.|\\.|\s')
def normalized_number_format(cell: Cell) -> str:
return (cell.number_format or GENERAL_FORMAT).strip()
def sql_escape(value: str) -> str:
return value.replace("'", "''")
def quote_sql_string(value: str) -> str:
return f"'{sql_escape(value)}'"
def normalize_header(value: object) -> str:
if value is None:
return ""
return str(value).strip()
def is_empty_cell(cell: Cell) -> bool:
value = cell.value
return value is None or (isinstance(value, str) and value.strip() == "")
def is_text_cell(cell: Cell) -> bool:
number_format = normalized_number_format(cell).lower()
return number_format in TEXT_FORMATS or cell.data_type == "s" or isinstance(cell.value, str)
def decimal_places_from_format(number_format: str) -> int:
cleaned = NUMERIC_SYMBOLS_RE.sub("", number_format or "")
if "." not in cleaned:
return 0
decimal_part = cleaned.split(".", 1)[1]
return sum(1 for char in decimal_part if char in "0#?")
def decimal_from_excel_number(value: int | float | Decimal, places: int) -> str:
decimal_value = Decimal(str(value))
if places <= 0:
return str(int(decimal_value.to_integral_value(rounding=ROUND_HALF_UP)))
quantizer = Decimal("1").scaleb(-places)
return format(decimal_value.quantize(quantizer, rounding=ROUND_HALF_UP), f".{places}f")
def format_date_value(value: dt.date | dt.datetime) -> str:
if isinstance(value, dt.datetime):
if value.time() == dt.time.min:
return quote_sql_string(value.strftime("%Y-%m-%d"))
return quote_sql_string(value.strftime("%Y-%m-%d %H:%M:%S"))
return quote_sql_string(value.strftime("%Y-%m-%d"))
def format_sql_value(cell: Cell) -> str:
value = cell.value
if is_text_cell(cell):
return quote_sql_string(str(value))
if isinstance(value, (dt.datetime, dt.date)) or is_date_format(normalized_number_format(cell)):
if isinstance(value, (dt.datetime, dt.date)):
return format_date_value(value)
return quote_sql_string(str(value))
if isinstance(value, bool):
return "1" if value else "0"
if isinstance(value, int):
return str(value)
if isinstance(value, float):
if not math.isfinite(value):
return quote_sql_string(str(value))
number_format = normalized_number_format(cell)
if number_format == GENERAL_FORMAT:
return str(int(value)) if value.is_integer() else str(Decimal(str(value)).normalize())
places = decimal_places_from_format(number_format)
if places == 0 and value.is_integer():
return str(int(value))
return decimal_from_excel_number(value, places)
if isinstance(value, Decimal):
number_format = normalized_number_format(cell)
if number_format == GENERAL_FORMAT:
return str(value.normalize())
places = decimal_places_from_format(number_format)
return decimal_from_excel_number(value, places)
return quote_sql_string(str(value))
def build_insert_statement(table_name: str, field_values: list[tuple[str, str]]) -> str:
columns = ", ".join(field for field, _ in field_values)
values = ", ".join(value for _, value in field_values)
return f"INSERT INTO {table_name} ({columns}) VALUES ({values});"
def iter_insert_statements(
excel_path: Path,
sheet_name: str,
table_name: str,
ignore_fields: Iterable[str] | None = None,
) -> list[str]:
ignored = {field.strip() for field in (ignore_fields or set()) if field.strip()}
workbook = load_workbook(excel_path, data_only=True)
worksheet = workbook[sheet_name]
headers = [normalize_header(cell.value) for cell in worksheet[1]]
statements: list[str] = []
for row in worksheet.iter_rows(min_row=2):
field_values: list[tuple[str, str]] = []
for header, cell in zip(headers, row):
if not header or header in ignored or is_empty_cell(cell):
continue
field_values.append((header, format_sql_value(cell)))
if field_values:
statements.append(build_insert_statement(table_name, field_values))
return statements
def generate_insert_sql(
excel_path: Path,
sheet_name: str,
table_name: str,
output_sql_path: Path,
ignore_fields: Iterable[str] | None = None,
) -> list[str]:
statements = iter_insert_statements(excel_path, sheet_name, table_name, ignore_fields)
if output_sql_path.parent != Path("."):
output_sql_path.parent.mkdir(parents=True, exist_ok=True)
output_sql_path.write_text("\n".join(statements) + ("\n" if statements else ""), encoding="utf-8")
return statements
def main() -> None:
statements = generate_insert_sql(
excel_path=EXCEL_PATH,
sheet_name=SHEET_NAME,
table_name=TABLE_NAME,
output_sql_path=OUTPUT_SQL_PATH,
ignore_fields=IGNORE_FIELDS,
)
print(f"Generated {len(statements)} SQL statement(s): {OUTPUT_SQL_PATH}")
if __name__ == "__main__":
main()脚本 生成sql update
python
from __future__ import annotations
import datetime as dt
import math
import re
from decimal import Decimal, ROUND_HALF_UP
from pathlib import Path
from typing import Iterable
from openpyxl import load_workbook
from openpyxl.cell.cell import Cell
from openpyxl.styles.numbers import is_date_format
# ====== Configuration: change these values before running ======
EXCEL_PATH = Path(r"dat.xlsx")
SHEET_NAME = "Sheet1"
TABLE_NAME = "sys_user"
OUTPUT_SQL_PATH = Path(r"update_data.sql")
ID_FIELD = "id"
IGNORE_FIELDS = {
}
# ==============================================================
TEXT_FORMATS = {"@", "text"}
GENERAL_FORMAT = "General"
NUMERIC_SYMBOLS_RE = re.compile(r'"[^"]*"|\[[^\]]*\]|_.|\\.|\s')
def normalized_number_format(cell: Cell) -> str:
return (cell.number_format or GENERAL_FORMAT).strip()
def sql_escape(value: str) -> str:
return value.replace("'", "''")
def quote_sql_string(value: str) -> str:
return f"'{sql_escape(value)}'"
def normalize_header(value: object) -> str:
if value is None:
return ""
return str(value).strip()
def is_empty_cell(cell: Cell) -> bool:
value = cell.value
return value is None or (isinstance(value, str) and value.strip() == "")
def is_text_cell(cell: Cell) -> bool:
number_format = normalized_number_format(cell).lower()
return number_format in TEXT_FORMATS or cell.data_type == "s" or isinstance(cell.value, str)
def decimal_places_from_format(number_format: str) -> int:
cleaned = NUMERIC_SYMBOLS_RE.sub("", number_format or "")
if "." not in cleaned:
return 0
decimal_part = cleaned.split(".", 1)[1]
return sum(1 for char in decimal_part if char in "0#?")
def decimal_from_excel_number(value: int | float | Decimal, places: int) -> str:
decimal_value = Decimal(str(value))
if places <= 0:
return str(int(decimal_value.to_integral_value(rounding=ROUND_HALF_UP)))
quantizer = Decimal("1").scaleb(-places)
return format(decimal_value.quantize(quantizer, rounding=ROUND_HALF_UP), f".{places}f")
def format_date_value(value: dt.date | dt.datetime) -> str:
if isinstance(value, dt.datetime):
if value.time() == dt.time.min:
return quote_sql_string(value.strftime("%Y-%m-%d"))
return quote_sql_string(value.strftime("%Y-%m-%d %H:%M:%S"))
return quote_sql_string(value.strftime("%Y-%m-%d"))
def format_sql_value(cell: Cell) -> str:
value = cell.value
if is_text_cell(cell):
return quote_sql_string(str(value))
if isinstance(value, (dt.datetime, dt.date)) or is_date_format(normalized_number_format(cell)):
if isinstance(value, (dt.datetime, dt.date)):
return format_date_value(value)
return quote_sql_string(str(value))
if isinstance(value, bool):
return "1" if value else "0"
if isinstance(value, int):
return str(value)
if isinstance(value, float):
if not math.isfinite(value):
return quote_sql_string(str(value))
number_format = normalized_number_format(cell)
if number_format == GENERAL_FORMAT:
return str(int(value)) if value.is_integer() else str(Decimal(str(value)).normalize())
places = decimal_places_from_format(number_format)
if places == 0 and value.is_integer():
return str(int(value))
return decimal_from_excel_number(value, places)
if isinstance(value, Decimal):
number_format = normalized_number_format(cell)
if number_format == GENERAL_FORMAT:
return str(value.normalize())
places = decimal_places_from_format(number_format)
return decimal_from_excel_number(value, places)
return quote_sql_string(str(value))
def build_update_statement(table_name: str, assignments: list[tuple[str, str]], id_field: str, id_value: str) -> str:
set_clause = ", ".join(f"{field} = {value}" for field, value in assignments)
return f"UPDATE {table_name} SET {set_clause} WHERE {id_field} = {id_value};"
def iter_update_statements(
excel_path: Path,
sheet_name: str,
table_name: str,
id_field: str,
ignore_fields: Iterable[str] | None = None,
) -> list[str]:
ignored = {field.strip() for field in (ignore_fields or set()) if field.strip()}
workbook = load_workbook(excel_path, data_only=True)
worksheet = workbook[sheet_name]
headers = [normalize_header(cell.value) for cell in worksheet[1]]
statements: list[str] = []
for row in worksheet.iter_rows(min_row=2):
id_value = ""
assignments: list[tuple[str, str]] = []
for header, cell in zip(headers, row):
if not header or header in ignored or is_empty_cell(cell):
continue
sql_value = format_sql_value(cell)
if header == id_field:
id_value = sql_value
continue
assignments.append((header, sql_value))
if id_value and assignments:
statements.append(build_update_statement(table_name, assignments, id_field, id_value))
return statements
def generate_update_sql(
excel_path: Path,
sheet_name: str,
table_name: str,
output_sql_path: Path,
id_field: str = ID_FIELD,
ignore_fields: Iterable[str] | None = None,
) -> list[str]:
statements = iter_update_statements(excel_path, sheet_name, table_name, id_field, ignore_fields)
if output_sql_path.parent != Path("."):
output_sql_path.parent.mkdir(parents=True, exist_ok=True)
output_sql_path.write_text("\n".join(statements) + ("\n" if statements else ""), encoding="utf-8")
return statements
def main() -> None:
statements = generate_update_sql(
excel_path=EXCEL_PATH,
sheet_name=SHEET_NAME,
table_name=TABLE_NAME,
output_sql_path=OUTPUT_SQL_PATH,
id_field=ID_FIELD,
ignore_fields=IGNORE_FIELDS,
)
print(f"Generated {len(statements)} SQL statement(s): {OUTPUT_SQL_PATH}")
if __name__ == "__main__":
main()