sqlalchemy множественный сброс перед фиксацией - PullRequest
0 голосов
/ 29 ноября 2018

Я хочу вставить записи в 3 таблицы.Коды указаны ниже.

    sessionDB.autocommit = False
    # insert Address
    addrRecord = Addres(street=street, city=city, zip_code=zip_code)
    sessionDB.add(addrRecord)
    sessionDB.flush()

    # insert customer
    cRecord = Customer(email=email, passwords=password, kind='individual', aID=addrRecord.aID)
    sessionDB.add(cRecord)
    sessionDB.flush()

    # insert Hcustomer
    homeCRecord = HomeCu(cID=cRecord.cID, fname=first_name, lname=last_name, age=age, marriage=marriage, remain=remain)
    sessionDB.add(homeCRecord)

    print (addrRecord.city, cRecord.kind, homeCRecord.lname)
    sessionDB.commit()

Ключ Адреса - aID, а ключ Клиента - cID.Они с автоматическим приращением.В Customer есть внешний ключ, ограниченный aID Адреса.CID внешнего ключа HomeCu ограничен CID Клиента.Поэтому я хочу последовательно вставить адреса, клиентов, HomeCu, во время которых мне нужно получить ключи без выполнения коммита.Я использовал flush (), чтобы получить ключи, но потерпел неудачу при операции фиксации.Почему во время операции фиксации значение, например, email, пароль, становится None, а предложение для печати работает хорошо?Я боролся с этим часами.Ваша помощь будет принята с благодарностью.Большое спасибо !!!

Вот журнал ошибок:

Traceback (последний последний вызов):
Файл
"/ usr / local / Cellar /python3 / 3.6.3 / Frameworks / Python.framework / Versions / 3.6 / lib / python3.6 / site-packages / sqlalchemy / engine / base.py ", строка 1193, в контексте _execute_context)
Файл" / usr /local / Cellar / python3 / 3.6.3 / Frameworks / Python.framework / Versions / 3.6 / lib / python3.6 / site-packages / sqlalchemy / engine / default.py ", строка 509, в do_execute cursor.execute (оператор,параметры)

Файл "/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/cursors.py",строка 170, в результате выполнения = self._query (запрос)
Файл "/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/cursors.py ", строка 328, в _query conn.query (q)
Файл" /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6 / site-packages / pymysql / connections.py ", строка 516, в запросе.6 / site-packages / pymysql / connections.py ", строка 727, в _read_query_result result.read ()
Файл" /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6 / lib / python3.6 / site-packages / pymysql / connections.py ", строка 1066, в файле read first_packet = self.connection._read_packet ()

File" / usr / local / Cellar / python3 /3.6.3 / Frameworks / Python.framework / Versions / 3.6 / lib / python3.6 / site-packages / pymysql / connections.py ", строка 683, в _read_packet packet.check_error ()
файл" / usr / local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/protocol.py ", строка 220, в check_error err.raise_mysql_exception (self._data)

Файл "/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/err.py", строка 109, в методе yield_mysql_exception повысить класс ошибок (errno, errval)):
Файл "/ Volumes / Code / Previous
Content / grad / 2018_2019 / db / final / app / modelController.py", строка 164, в registerIndividual ('534 Tilling St', 'New York','15233', '123@qq.com', '123', 'Zimo', 'Tang', 23, 755.23, 0)
Файл
"/ Объемы / Код / Предыдущий
Содержимое / град/2018_2019/db/final/app/modelController.py ", строка 129, в registerIndividual sessionDB.commit ()
Файл" /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6 / lib / python3.6 / site-packages / sqlalchemy / orm / session.py ", строка 943, в коммите self.transaction.commit ()
Файл" /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/session.py ", строка 467, в коммите self._prepare_impl ()
File" / uстер / местные / Подвал / python3 / 3.6.3 / Frameworks / Python.framework / Версии / 3,6 / Библиотека / python3.6 / сайт-пакеты / SQLAlchemy / ОРМ / session.py»,строка 447, в _prepare_impl self.session.flush ()
File "/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy / orm / session.py ", строка 2254, в чистом виде self._flush (объекты)
Файл" /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6 / site-packages / sqlalchemy / orm / session.py ", строка 2381, в _flush Transactions.rollback (_capture_exception = True)

Файл" /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py ", строка 66, в выход compat.reraise (exc_type, exc_value, exc_tb)

Файл "/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/util/compat.py", строка 249, в ререйзе увеличить значение
Файл "/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/session.py ", строка 2345, в_flush flush_context.execute ()
Файл "/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py ", строка 395, in execute rec.execute (self)
File" /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages / sqlalchemy / orm / unitofwork.py ", строка 560, в файле выполнить uow
Файл" /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py ", строка 181, в маппере save_obj, таблица, вставка)
Файл" /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py ", строка 830, в _emit_insert_statements execute (оператор, несколько парам)
Файл" /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/engine/base.py ", строка 948, в функции execute return meth (self, multiparams, params)
File"/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/sql/elements.py ", строка 269, в _execute_on_connection, обратное соединение._execute_clauseelement (self, multiparams, params)
Файл
"/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/engine/base.py ", строка 1060, в _execute_clauseelement compiled_sql, дистилляция_params

Файл" /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6 / site-packages / sqlalchemy / engine / base.py ", строка 1200, в контексте _execute_context)
Файл" /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/engine/base.py ", строка 1413, в _handle_dbapi_exception exc_info
Файл" /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Версии / 3.6 / lib / python3.6 / site-packages / sqlalchemy / util / compat.py ", строка 265, в представлении Raise_from_causese (тип (исключение), исключение, tb = exc_tb, причина = причина)
Файл
"/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6 / site-packages / sqlalchemy / util / compat.py ", строка 248, в ререйзе увеличить значение .with_traceback (tb)
Файл" /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework / Versions / 3.6 / lib / python3.6 / site-packages / sqlalchemy / engine / base.py ", строка 1193, в контексте _execute_context)
Файл" /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/engine/default.py ", строка 509, в файле do_execute cursor.execute (оператор, параметры)

файл"/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/cursors.py",строка 170, в результате выполнения = self._query (запрос)
Файл "/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/cursors.py ", строка 328, в _query conn.query (q)
Файл" /usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6 / site-packages / pymysql / connections.py ", строка 516, в запросе self._acted_rows = self._read_query_result (unbuffered = unbuffered)
Файл
" /usr/local/Cellar/python3/3.6.3 / Frameworks / Python.framework / Versions / 3.6 / lib / python3.6 / site-packages / pymysql / connections.py ", строка 727, в _read_query_result result.read ()
File" / usr / local / Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/connections.py ", строка 1066, в файле read first_packet = self.connection._read_packet ()

Файл "/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/connections.py", строка 683, в_читать_packet packet.check_error ()
Файл "/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/protocol.py", строка 220, в check_error err.raise_mysql_exception (self._data)

Файл "/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/err.py ", строка 109, в методе lift_mysql_exception поднять errorclass (errno, errval) sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1048,« Электронная почта столбца не может быть нулевой »)[SQL: 'INSERT INTO customer (cID, электронная почта, пароли, kind, aID) VALUES (% (cID) s,% (email) s,% (пароли) s,% (kind) s,% (aID) s) '] [параметры: {' cID ': 31,' email ': нет,' passwords ': нет,' kind ': нет,' aID ': нет}] (Справочная информация об ошибке: http://sqlalche.me/e/gkpj)

Процесс завершен с кодом выхода 1

1 Ответ

0 голосов
/ 01 февраля 2019
addrRecord = sessionDB.query(Addres).filter(Addres.street == street).filter(Addres.city == city) \
                .filter(Addres.zip_code == zip_code).first()
            cRecord = Customer(email=email, passwords=password, kind='individual', aID=addrRecord.aID)
            homeCRecord = HomeCu(fname=first_name, lname=last_name, age=age, marriage=marriage, remain=remain)
            homeCRecord.customer = cRecord
            sessionDB.add(cRecord)
            sessionDB.add(homeCRecord)

Наконец-то я не использовал флеш.Я думаю, что использование сброса в течение нескольких раз приведет к ошибке.Я добавляю отношения в экземпляре.Надеюсь, это может кому-то помочь.

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