python - 为什么有 2 个不同的输出

标签 python sql sqlalchemy

from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey,create_engine
engine = create_engine('sqlite:///college.db',echo = True)
metadata = MetaData()
users = Table('users', metadata,
      Column('id', Integer, primary_key=True),
      Column('name', String(50)),
      Column('fullname', String(50)),
)

addresses = Table('addresses', metadata,
   Column('id', Integer, primary_key=True),
   Column('user_id', None, ForeignKey('users.id')),
   Column('email_address', String(50), nullable=False))
metadata.create_all(engine)

这是第一个输出:

CREATE TABLE addresses (
id INTEGER NOT NULL,
user_id INTEGER,
email_address VARCHAR NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY(user_id) REFERENCES users (id)

然后,我再次点击运行,输出发生了变化:

2019-04-18 21:06:57,881 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1
2019-04-18 21:06:57,886 INFO sqlalchemy.engine.base.Engine ()
2019-04-18 21:06:57,892 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1
2019-04-18 21:06:57,899 INFO sqlalchemy.engine.base.Engine ()
2019-04-18 21:06:57,904 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("users")
2019-04-18 21:06:57,909 INFO sqlalchemy.engine.base.Engine ()
2019-04-18 21:06:57,923 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("addresses")
2019-04-18 21:06:57,928 INFO sqlalchemy.engine.base.Engine ()
metadata.create_all(engine)
2019-04-18 21:07:17,156 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("users")
2019-04-18 21:07:17,157 INFO sqlalchemy.engine.base.Engine ()

有人可以解释一下为什么我第二次运行后会有一些变化吗?

最佳答案

当您第二次运行代码时,表已经创建,这就是您获得所看到的输出的原因。如果您想再次获得相同的输出,则必须先删除表:

from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey,create_engine
engine = create_engine('sqlite:///college.db',echo = True)
metadata = MetaData()
users = Table('users', metadata,
      Column('id', Integer, primary_key=True),
      Column('name', String(50)),
      Column('fullname', String(50)),
)

addresses = Table('addresses', metadata,
   Column('id', Integer, primary_key=True),
   Column('user_id', None, ForeignKey('users.id')),
   Column('email_address', String(50), nullable=False))
metadata.create_all(engine)
users.drop(engine)
addresses.drop(engine)

但这当然会给你留下一个空的数据库! 要在重新创建表时获得异常,您可以使用 checkfirst 参数:

metadata.create_all(engine, checkfirst=False)

PRAGMA您看到的输出对于获取表的一些元数据很有用:

foo = engine.execute('PRAGMA table_info("addresses")').fetchall()
print(foo)

另请参阅this question .

关于python - 为什么有 2 个不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55758532/

相关文章:

python - Django 表单 ChoiceField 依赖于另一个 ChoiceField

python - sqlalchemy 转储元数据到文件

mysql - MySQL GROUP_CONCAT() 中的多次更新

sql-server - Pandas 和 SQLAlchemy : df. to_sql() with SQLAlchemy 2.0 future=True 在使用来自 engine.begin() 的连接时抛出错误

python - 找不到 testing.postgresql 命令 : initdb inside docker

python - child 有多个外键给 parent ?

python - 如何从另一个屏幕类调用Python中的函数?

python - 计算给定 html 标签具有的 css 样式属性

javascript - 如何从 html 表单执行 php 查询?

mysql - 查询过滤权限