Sqlalchemy如果表不存在

时间:2015-10-10 11:01:17

标签: python sqlalchemy

我写了一个创建空数据库文件的模块

def create_database():
    engine = create_engine("sqlite:///myexample.db", echo=True)
    metadata = MetaData(engine)
    metadata.create_all()

但是在另一个函数中,我想打开myexample.db数据库,如果它还没有该表,则创建表。

我将创建的第一个后续表的EG将是:

Table(Variable_TableName, metadata,
       Column('Id', Integer, primary_key=True, nullable=False),
       Column('Date', Date),
       Column('Volume', Float))

(因为它最初是一个空数据库,它将没有表格,但随后,我可以添加更多表格。这就是我想说的。)

有什么建议吗?

4 个答案:

答案 0 :(得分:38)

我已经设法弄清楚我打算做什么。我使用engine.dialect.has_table(engine, Variable_tableName)来检查数据库是否包含表格。 IF 它不会,然后它将继续在数据库中创建一个表。

示例代码:

engine = create_engine("sqlite:///myexample.db")  # Access the DB Engine
if not engine.dialect.has_table(engine, Variable_tableName):  # If table don't exist, Create.
    metadata = MetaData(engine)
    # Create a table with the appropriate Columns
    Table(Variable_tableName, metadata,
          Column('Id', Integer, primary_key=True, nullable=False), 
          Column('Date', Date), Column('Country', String),
          Column('Brand', String), Column('Price', Float),
    # Implement the creation
    metadata.create_all()

这似乎给了我正在寻找的东西。

答案 1 :(得分:4)

对于那些首先在某些let InitialState = { phone: '', pinCode: [], verifyCode: [], }; case SET_PINCODE: return { ...state, pinCode: [...state.pinCode, action.pincode] } case CLEAR_PINCODE: return { ...state, pinCode: [...state.pinCode.slice(0, -1)] } 文件中定义表的人,以及其他表。 这是一个代码片段,用于查找代表我们要创建的表的类(因此以后我们可以使用相同的代码来对其进行查询)

但是与上面的models.table一起,我仍然使用if来运行代码

checkfirst=True

models.table

ORMTable.__table__.create(bind=engine, checkfirst=True)

表格

然后在表单操作文件中:

class TableA(Base):
class TableB(Base):
class NewTableC(Base):

   id = Column('id', Text)
   name = Column('name', Text)

答案 2 :(得分:3)

请注意,在“ Base.metadata” documentation中,它声明了有关create_all的信息:

  

默认情况下,将不会尝试重新创建表   在目标数据库中。

如果您可以看到create_all接受以下参数:create_all(self,bind = None,table = None,checkfirst = True),并根据文档:

  

默认为True,不对表中已经存在的表发出CREATEs   目标数据库。

因此,如果我正确理解了您的问题,则可以跳过该条件。

答案 3 :(得分:0)

engine.dialect.has_table在cx_oracle上对我不起作用。 我得到AttributeError: 'OracleDialect_cx_oracle' object has no attribute 'default_schema_name'

我写了一个变通方法:

from sqlalchemy.engine.base import Engine  
def orcl_tab_or_view_exists(in_engine: Engine, in_object: str,  in_object_name: str,)-> bool:
    """Checks if Oracle table exists in current in_engine connection

    in_object: 'table' | 'view'

    in_object_name: table_name | view_name
      """
    obj_query = """SELECT {o}_name FROM all_{o}s WHERE owner = SYS_CONTEXT ('userenv', 'current_schema') AND {o}_name = '{on}'
    """.format(o=in_object, on=in_object_name.upper())
    with in_engine.connect() as connection:
        result = connection.execute(obj_query)
    return len(list(result)) > 0