2017-05-25 78 views
0

我覺得很奇怪,人們不使用依賴注入來管理他們對SQLAlchemy的使用。根據文檔,需要對錶進行引用來執行數據庫操作(如插入),但只有在創建表後纔會引用該表!我是否需要依賴注入來使用SQLAlchemy?

>>> 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) 

根據上述snippet,一個需要conn連接對象,該users表對象和ins

這意味着數據庫連接,數據庫操作和表的定義必須在同一個文件來實現表達式對象來執行與數據庫的完整事務。除非使用某種形式的依賴注入,否則三者必須位於同一個文件中。

人們是如何構建自己的代碼來使其易於管理的?

+1

你可以將你的'Table'對象存儲在不同的模塊中,甚至包中並導入它,爲什麼它們應該在同一個文件中? –

+0

每次文件導入時,表格都會正確創建? – dopatraman

+0

不,模塊對象是在第一次導入時創建的,接下來它會明顯使用緩存的對象 –

回答

2
  • 一個需要對錶的引用來執行類似的插入數據庫操作,但創建後,一個只得到一個參照表!

    我這裏看不到任何問題,在RDBMS你還應該創建表進行執行其他操作(如CRUD)。

    如果你不想創建Table對象或mapping,你總是可以執行raw SQL statements

  • 這意味着數據庫連接,數據庫操作和表的定義必須在同一個文件

    錯誤來完成。我們可以重構你的例子爲單獨modules

    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)) 
    

    main.py

    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 ,我錯過了什麼?

2

你不需要Python,你可以使用模塊導入作爲單例,這就是大多數人大部分時間做的事情。任何模塊級代碼都將在導入模塊時執行。

但是... DI確實適合大型項目,其中不同的圖層生活在不同的python包中。我使用ZCA(Zope組件架構)作爲我所有大型sqlalchemy項目的DI系統,這非常棒。這是一堆額外的樣板,所以大多數中小型項目都不會打擾,但它對於大型架構來說非常好,而且對於測試具有靈活性,很容易模擬出服務,並且只需要DI系統負責換掉你的服務。

就我個人而言,我將一個組件作爲會話工廠的模型引擎,並使用zca查找來獲取它。我還將模型類註冊爲ZCA實用程序,並通過接口查找來獲取它們,以便可以將其他可重用組件作爲適用於不同模型類的zca適配器來實現。很多來自Zope世界的框架都使用它:Pyramid,Plone,Grok,BlueBream,Twisted。

我愛DI,但YMMV,其他人討厭的樣板!