2016-07-05 99 views
0

我創建了許多我想要保存到數據庫的類。我希望能夠運行具有特定標誌的應用程序來獲取所有這些類,並在我的數據庫中創建相應的表。爲此,我試圖導入這些類,然後調用Base.metadata.create_all(engine)方法。但是,這是行不通的。同時,當我從每個實際類的文件中調用該表時,將創建這些表。SQLAlchemy,Declarative,PostgreSQL:無法創建表格

我該如何處理創建這些表的任務?我應該嘗試從單個文件/腳本創建它們,還是將該行添加到每個類中?

這裏是我的代碼示例:

1)Item.py

from sqlalchemy import Column, Integer, String, Float 
from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

class Item(Base): 
    __tablename__ = "items" 

    id = Column(Integer, primary_key=True) 
    name = Column(String) 

    def __repr__(self): 
     return "<~ {} ~> name: {}".format(self.id, self.name) 

2)main.py

from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker 

def main(): 
    from sqlalchemy.ext.declarative import declarative_base 
    Base = declarative_base() 
    engine = create_engine('postgresql+psycopg2://me:[email protected]/my_first_database', echo=True) 
    from Item import Item 
    print(Item) 
    print(Item.__table__) 
    Base.metadata.create_all(engine) 

main() 

對不起進口的怪異命令,但我在某處讀取導入你的課程和基地事宜的順序,所以我試着玩弄它。

+0

我發現的一件事是,如果我說'import Item',然後'Item .__ base __。metadata.create_all(引擎)'一切正常。但它看起來有點骯髒的黑客。我認爲每次創建Base時Base都是一樣的。 – Ibolit

回答

3

你已經在Item.py創建Base,只是將其導入main.py

如果main.pyItem.py在同一個文件夾,然後在main.py

from Item import Base, Item

,並刪除裏面main全部進口功能,所以main.py看起來像:

from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker 
from Item import Base, Item 

def main(): 
    engine = create_engine('postgresql+psycopg2://me:[email protected]/my_first_database', echo=True) 
    print(Item) 
    print(Item.__table__) 
    Base.metadata.create_all(engine) 

main() 
+0

如果我有一些這樣的DAO呢?我是否在其他地方創建基地,然後將其導入每個這些類中? – Ibolit

+0

你爲什麼不把它們放在一個文件中?比如'models.py'並且在這個文件中有'Base'。 –

+0

這是一個想法。來自Java,在一個文件中有幾個「公共」類不是首先想到的:) – Ibolit