我写了一个创建空数据库文件的模块
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))
(因为它最初是一个空数据库,它将没有表格,但随后,我可以添加更多表格。这就是我想说的。)
有什么建议吗?
答案 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
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