Почему есть 2 разных выхода - PullRequest
1 голос
/ 19 апреля 2019
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 ()

Не может кто-нибудь объяснить, почему есть некоторые изменения послея нажимаю «бежать» во второй раз?

1 Ответ

0 голосов
/ 19 апреля 2019

Когда вы запускаете код во второй раз, таблицы уже созданы, и поэтому вы получаете вывод, который видите. Если вы хотите получить тот же вывод снова, вы должны сначала отбросить свои таблицы:

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)

См. Также этот вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...