From 4563852f6f36efc1c42a7e32d40815a45e5dba60 Mon Sep 17 00:00:00 2001 From: geeker Date: Thu, 24 Sep 2026 19:59:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=9A=E6=BA=90=E7=8E=AF=E5=A2=83=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E7=A1=AE=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env/__init__.py | 0 .env/dotenv_app.py | 57 +++++++++++++++++++++++++++++++++++ .env/pydantic_settings_app.py | 24 +++++++++++++++ .gitignore | 5 +-- model/order.py | 44 +++++++++++++-------------- pyproject.toml | 2 ++ uv.lock | 4 +++ 7 files changed, 112 insertions(+), 24 deletions(-) create mode 100644 .env/__init__.py create mode 100644 .env/dotenv_app.py create mode 100644 .env/pydantic_settings_app.py diff --git a/.env/__init__.py b/.env/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/.env/dotenv_app.py b/.env/dotenv_app.py new file mode 100644 index 0000000..8a3dc42 --- /dev/null +++ b/.env/dotenv_app.py @@ -0,0 +1,57 @@ +from sqlalchemy import create_engine +from sqlalchemy.orm import Session + +from dotenv import load_dotenv +import os + +# 指定路径必须是指定路径 +load_dotenv( + dotenv_path=f".env.{os.getenv("ENVIRONMENT",'dev')}", # 指定 .env 文件路径,默认自动查找, 支持自动从当前目录递归向上查询 + override=False, # 是否覆盖已存在的环境变量,默认 False + verbose=False, # 是否打印调试信息 + encoding="utf-8", # 文件编码 +) + +# load_dotenv() # 默认 .env, 递归向上 + +# .env 解析规则: 必须有空格,多个空格有问题? +db_url = os.getenv("DATABASE_URL") +print(db_url) + +key_with_q = os.getenv("KEY_WITH_Q") +print(key_with_q) + +key_with_q1 = os.getenv("KEY_WITH_Q1") +print(key_with_q1) + +key_with_q2 = os.getenv("KEY_WITH_Q2") +print(key_with_q2) + +key_without_q = os.getenv("KEY_WITHOUT_Q") +print(key_without_q) + + + + + + +# engine = create_engine(db_url) + +# 三种实现方式皆可! +def get_session(): + # Session = sessionmaker(bind=engine + # , autoflush=False + # , autocommit=False + # ) + + # session = Session(engine) + # try: + # yield session + # finally: + # session.close() + + with Session() as session: + yield session + + # with Session(engine) as session: + # yield session diff --git a/.env/pydantic_settings_app.py b/.env/pydantic_settings_app.py new file mode 100644 index 0000000..e834ecd --- /dev/null +++ b/.env/pydantic_settings_app.py @@ -0,0 +1,24 @@ +from pydantic_settings import BaseSettings, SettingsConfigDict +import os + +class Settings(BaseSettings): + model_config = SettingsConfigDict( + env_file=f".env.{os.getenv("ENVIRONMENT",'dev')}", # 指定 .env 文件 + env_file_encoding="utf-8", + case_sensitive=False, # 大小写不敏感 <- + extra="ignore", # 忽略 .env 中多余的键 + ) + + database_url: str + debug: bool = False + secret_key: str + log_level: str = "INFO" + + +settings = Settings() + +print(settings.model_config) +print(settings.database_url) +print(settings.debug) +print(settings.secret_key) +print(settings.log_level) \ No newline at end of file diff --git a/.gitignore b/.gitignore index 234415f..588dce5 100644 --- a/.gitignore +++ b/.gitignore @@ -10,8 +10,9 @@ tests/ .github/ *.md !README.md -.env -.env.* + +!.env.example +.env/.* Dockerfile __pycache__ \ No newline at end of file diff --git a/model/order.py b/model/order.py index b26af1f..4bc41bf 100644 --- a/model/order.py +++ b/model/order.py @@ -2,28 +2,28 @@ from pydantic import BaseModel from sqlalchemy.orm import declarative_base,sessionmaker,Session from sqlalchemy import Column, Integer,String,DATETIME,create_engine from datetime import datetime - -db_url = "mysql+pymysql://geeker:geeker@127.0.0.1:3306/fastapi_tutor?charset=utf8mb4" -engine = create_engine(db_url) - - -def get_session(): - # Session = sessionmaker(bind=engine - # , autoflush=False - # , autocommit=False - # ) - - # session = Session(engine) - # try: - # yield session - # finally: - # session.close() - - with Session() as session: - yield session - - # with Session(engine) as session: - # yield session +# +# db_url = "mysql+pymysql://geeker:geeker@127.0.0.1:3306/fastapi_tutor?charset=utf8mb4" +# engine = create_engine(db_url) +# +# +# def get_session(): +# # Session = sessionmaker(bind=engine +# # , autoflush=False +# # , autocommit=False +# # ) +# +# # session = Session(engine) +# # try: +# # yield session +# # finally: +# # session.close() +# +# with Session() as session: +# yield session +# +# # with Session(engine) as session: +# # yield session Base = declarative_base() # 执行函数,返回一个基类 diff --git a/pyproject.toml b/pyproject.toml index f22daa8..e283f26 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,6 +6,8 @@ dependencies = [ "aiomysql>=0.3.2", "asyncmy>=0.2.15", "fastapi[standard]>=0.141.1", + "pydantic-settings>=2.15.0", "pymysql>=1.2.3", + "python-dotenv>=1.2.3", "sqlalchemy>=2.0.54", ] diff --git a/uv.lock b/uv.lock index 2e1debd..2e18173 100644 --- a/uv.lock +++ b/uv.lock @@ -234,7 +234,9 @@ dependencies = [ { name = "aiomysql" }, { name = "asyncmy" }, { name = "fastapi", extra = ["standard"] }, + { name = "pydantic-settings" }, { name = "pymysql" }, + { name = "python-dotenv" }, { name = "sqlalchemy" }, ] @@ -243,7 +245,9 @@ requires-dist = [ { name = "aiomysql", specifier = ">=0.3.2" }, { name = "asyncmy", specifier = ">=0.2.15" }, { name = "fastapi", extras = ["standard"], specifier = ">=0.141.1" }, + { name = "pydantic-settings", specifier = ">=2.15.0" }, { name = "pymysql", specifier = ">=1.2.3" }, + { name = "python-dotenv", specifier = ">=1.2.3" }, { name = "sqlalchemy", specifier = ">=2.0.54" }, ]