Python 我需要依赖注入来使用SQLAlchemy吗?
我觉得奇怪的是,人们不使用依赖注入来管理他们对SQLAlchemy的使用。根据文档,需要对表进行引用才能执行插入之类的db操作,但只有在创建表之后才能获得对表的引用 这意味着db连接、db操作和表声明必须在同一个文件中完成:Python 我需要依赖注入来使用SQLAlchemy吗?,python,sqlalchemy,Python,Sqlalchemy,我觉得奇怪的是,人们不使用依赖注入来管理他们对SQLAlchemy的使用。根据文档,需要对表进行引用才能执行插入之类的db操作,但只有在创建表之后才能获得对表的引用 这意味着db连接、db操作和表声明必须在同一个文件中完成: >>> from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey >>> conn = engine.connect() >>>
>>> from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
>>> conn = engine.connect()
>>> metadata = MetaData()
>>> users = Table('users', metadata,
... Column('id', Integer, primary_key=True),
... Column('name', String),
... Column('fullname', String),
... )
>>> ins = users.insert()
>>> result = conn.execute(ins)
根据以上内容,需要conn
连接对象、users
表对象和ins
表达式对象来执行与数据库的完整事务。除非使用某种形式的依赖项注入,否则所有三个都必须在同一个文件中
人们是如何组织代码使其易于管理的?- 我们需要一个对表的引用来执行插入之类的db操作,但只有在创建表之后才能获得对表的引用 我在这里看不到任何问题,在这里,您还应该创建表来执行其他操作(如) 如果您不想创建对象或文件,您可以随时执行
-
这意味着db连接、db操作和表声明必须在同一个文件中完成
不对。我们可以将您的示例重构为单独的
:tables.py
from sqlalchemy import MetaData, Table, Column, Integer, String metadata = MetaData() users = Table('users', metadata, Column('id', Integer, primary_key=True), Column('name', String), Column('fullname', String))
from sqlalchemy import create_engine from tables import users db_uri = 'sqlite:///' engine = create_engine(db_uri) users.create(bind=engine) conn = engine.connect() values = {'name': 'John', 'fullname': 'Doe'} ins = users.insert().values(values) result = conn.execute(ins)
:main.py
from sqlalchemy import MetaData, Table, Column, Integer, String metadata = MetaData() users = Table('users', metadata, Column('id', Integer, primary_key=True), Column('name', String), Column('fullname', String))
正如我们在from sqlalchemy import create_engine from tables import users db_uri = 'sqlite:///' engine = create_engine(db_uri) users.create(bind=engine) conn = engine.connect() values = {'name': 'John', 'fullname': 'Doe'} ins = users.insert().values(values) result = conn.execute(ins)
模块中看到的,当在tables.py
中处理连接/事务时,我是否遗漏了什么main.py
- 我们需要一个对表的引用来执行插入之类的db操作,但只有在创建表之后才能获得对表的引用 我在这里看不到任何问题,在这里,您还应该创建表来执行其他操作(如) 如果您不想创建对象或文件,您可以随时执行
-
这意味着db连接、db操作和表声明必须在同一个文件中完成
不对。我们可以将您的示例重构为单独的
:tables.py
from sqlalchemy import MetaData, Table, Column, Integer, String metadata = MetaData() users = Table('users', metadata, Column('id', Integer, primary_key=True), Column('name', String), Column('fullname', String))
from sqlalchemy import create_engine from tables import users db_uri = 'sqlite:///' engine = create_engine(db_uri) users.create(bind=engine) conn = engine.connect() values = {'name': 'John', 'fullname': 'Doe'} ins = users.insert().values(values) result = conn.execute(ins)
:main.py
from sqlalchemy import MetaData, Table, Column, Integer, String metadata = MetaData() users = Table('users', metadata, Column('id', Integer, primary_key=True), Column('name', String), Column('fullname', String))
正如我们在from sqlalchemy import create_engine from tables import users db_uri = 'sqlite:///' engine = create_engine(db_uri) users.create(bind=engine) conn = engine.connect() values = {'name': 'John', 'fullname': 'Doe'} ins = users.insert().values(values) result = conn.execute(ins)
模块中看到的,当在tables.py
中处理连接/事务时,我是否遗漏了什么main.py
我喜欢DI,但YMMV,其他人讨厌样板 在Python中不需要它,您可以将模块导入作为单例使用,这是大多数人大多数时候所做的。任何模块级代码都将在导入模块时执行 但是。。。DI-sure适用于不同层位于不同python包中的大型项目。我使用ZCA(Zope组件体系结构)作为我所有大型sqlalchemy项目的DI系统,这非常棒。它是一堆额外的样板文件,所以大多数中小型项目都不需要麻烦,但它对于大规模体系结构来说确实不错,而且对于具有测试灵活性、易于模拟的服务以及让DI系统负责交换您的服务来说,它非常棒 就我个人而言,我用会话工厂制作了一个组件作为我的模型引擎,并使用zca查找来获取它。我还将模型类注册为ZCA实用程序,并通过接口查找获取它们,以便其他可重用组件可以作为不同模型类的ZCA适配器实现。Zope世界的许多框架都使用它:金字塔、Plone、Grok、BlueStream和Twisted
我喜欢DI,但YMMV,其他人讨厌样板 您可以将您的
表
对象存储在不同的模块中,甚至可以打包并导入,为什么它们应该在同一个文件中?每次导入文件时,表都会正确创建?不,模块对象是在第一次导入时创建的,下一步,它将使用缓存对象。您可以将表
对象存储在不同的模块甚至包中,然后将其导入,为什么它们应该在同一个文件中?每次导入文件时,表都会正确创建?不,模块对象是在第一次导入时创建的,下一步,它将使用缓存对象