Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我需要依赖注入来使用SQLAlchemy吗?_Python_Sqlalchemy - Fatal编程技术网

Python 我需要依赖注入来使用SQLAlchemy吗?

Python 我需要依赖注入来使用SQLAlchemy吗?,python,sqlalchemy,Python,Sqlalchemy,我觉得奇怪的是,人们不使用依赖注入来管理他们对SQLAlchemy的使用。根据文档,需要对表进行引用才能执行插入之类的db操作,但只有在创建表之后才能获得对表的引用 这意味着db连接、db操作和表声明必须在同一个文件中完成: >>> from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey >>> conn = engine.connect() >>>

我觉得奇怪的是,人们不使用依赖注入来管理他们对SQLAlchemy的使用。根据文档,需要对表进行引用才能执行插入之类的db操作,但只有在创建表之后才能获得对表的引用

这意味着db连接、db操作和表声明必须在同一个文件中完成:

>>> 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
        中处理连接/事务时,我是否遗漏了什么


      在Python中,您不需要它,您可以将模块导入作为单例使用,这是大多数人经常做的事情。任何模块级代码都将在导入模块时执行

      但是。。。DI-sure适用于不同层位于不同python包中的大型项目。我使用ZCA(Zope组件体系结构)作为我所有大型sqlalchemy项目的DI系统,这非常棒。它是一堆额外的样板文件,所以大多数中小型项目都不需要麻烦,但它对于大规模体系结构来说确实不错,而且对于具有测试灵活性、易于模拟的服务以及让DI系统负责交换您的服务来说,它非常棒

      就我个人而言,我用会话工厂制作了一个组件作为我的模型引擎,并使用zca查找来获取它。我还将模型类注册为ZCA实用程序,并通过接口查找获取它们,以便其他可重用组件可以作为不同模型类的ZCA适配器实现。Zope世界的许多框架都使用它:金字塔、Plone、Grok、BlueStream和Twisted


      我喜欢DI,但YMMV,其他人讨厌样板

      在Python中不需要它,您可以将模块导入作为单例使用,这是大多数人大多数时候所做的。任何模块级代码都将在导入模块时执行

      但是。。。DI-sure适用于不同层位于不同python包中的大型项目。我使用ZCA(Zope组件体系结构)作为我所有大型sqlalchemy项目的DI系统,这非常棒。它是一堆额外的样板文件,所以大多数中小型项目都不需要麻烦,但它对于大规模体系结构来说确实不错,而且对于具有测试灵活性、易于模拟的服务以及让DI系统负责交换您的服务来说,它非常棒

      就我个人而言,我用会话工厂制作了一个组件作为我的模型引擎,并使用zca查找来获取它。我还将模型类注册为ZCA实用程序,并通过接口查找获取它们,以便其他可重用组件可以作为不同模型类的ZCA适配器实现。Zope世界的许多框架都使用它:金字塔、Plone、Grok、BlueStream和Twisted


      我喜欢DI,但YMMV,其他人讨厌样板

      您可以将您的
      对象存储在不同的模块中,甚至可以打包并导入,为什么它们应该在同一个文件中?每次导入文件时,表都会正确创建?不,模块对象是在第一次导入时创建的,下一步,它将使用缓存对象。您可以将
      对象存储在不同的模块甚至包中,然后将其导入,为什么它们应该在同一个文件中?每次导入文件时,表都会正确创建?不,模块对象是在第一次导入时创建的,下一步,它将使用缓存对象