sqlalchemy-tickets Mailing List for SQLAlchemy (Page 4)
Brought to you by:
zzzeek
You can subscribe to this list here.
2006 |
Jan
|
Feb
|
Mar
(174) |
Apr
(50) |
May
(71) |
Jun
(129) |
Jul
(113) |
Aug
(141) |
Sep
(82) |
Oct
(142) |
Nov
(97) |
Dec
(72) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2007 |
Jan
(159) |
Feb
(213) |
Mar
(156) |
Apr
(151) |
May
(58) |
Jun
(166) |
Jul
(296) |
Aug
(198) |
Sep
(89) |
Oct
(133) |
Nov
(150) |
Dec
(122) |
2008 |
Jan
(144) |
Feb
(65) |
Mar
(71) |
Apr
(69) |
May
(143) |
Jun
(111) |
Jul
(113) |
Aug
(159) |
Sep
(81) |
Oct
(135) |
Nov
(107) |
Dec
(200) |
2009 |
Jan
(168) |
Feb
(109) |
Mar
(141) |
Apr
(128) |
May
(119) |
Jun
(132) |
Jul
(136) |
Aug
(154) |
Sep
(151) |
Oct
(181) |
Nov
(223) |
Dec
(169) |
2010 |
Jan
(103) |
Feb
(209) |
Mar
(201) |
Apr
(183) |
May
(134) |
Jun
(113) |
Jul
(110) |
Aug
(159) |
Sep
(138) |
Oct
(96) |
Nov
(116) |
Dec
(94) |
2011 |
Jan
(97) |
Feb
(188) |
Mar
(157) |
Apr
(158) |
May
(118) |
Jun
(102) |
Jul
(137) |
Aug
(113) |
Sep
(104) |
Oct
(108) |
Nov
(91) |
Dec
(162) |
2012 |
Jan
(189) |
Feb
(136) |
Mar
(153) |
Apr
(142) |
May
(90) |
Jun
(141) |
Jul
(67) |
Aug
(77) |
Sep
(113) |
Oct
(68) |
Nov
(101) |
Dec
(122) |
2013 |
Jan
(60) |
Feb
(77) |
Mar
(77) |
Apr
(129) |
May
(189) |
Jun
(155) |
Jul
(106) |
Aug
(123) |
Sep
(53) |
Oct
(142) |
Nov
(78) |
Dec
(102) |
2014 |
Jan
(143) |
Feb
(93) |
Mar
(35) |
Apr
(26) |
May
(27) |
Jun
(41) |
Jul
(45) |
Aug
(27) |
Sep
(37) |
Oct
(24) |
Nov
(22) |
Dec
(20) |
2015 |
Jan
(17) |
Feb
(15) |
Mar
(34) |
Apr
(55) |
May
(33) |
Jun
(31) |
Jul
(27) |
Aug
(17) |
Sep
(22) |
Oct
(26) |
Nov
(27) |
Dec
(22) |
2016 |
Jan
(20) |
Feb
(24) |
Mar
(23) |
Apr
(13) |
May
(17) |
Jun
(14) |
Jul
(31) |
Aug
(23) |
Sep
(24) |
Oct
(31) |
Nov
(23) |
Dec
(16) |
2017 |
Jan
(24) |
Feb
(20) |
Mar
(27) |
Apr
(24) |
May
(28) |
Jun
(18) |
Jul
(18) |
Aug
(23) |
Sep
(30) |
Oct
(17) |
Nov
(12) |
Dec
(12) |
2018 |
Jan
(27) |
Feb
(23) |
Mar
(13) |
Apr
(19) |
May
(21) |
Jun
(29) |
Jul
(11) |
Aug
(22) |
Sep
(14) |
Oct
(9) |
Nov
(24) |
Dec
|
From: Alessio B. <iss...@bi...> - 2018-07-10 14:36:36
|
New issue 4301: Query loading options being ignored when issued a second time https://bitbucket.org/zzzeek/sqlalchemy/issues/4301/query-loading-options-being-ignored-when Alessio Bogon: I attach a patch for the test_mapper.py module that reproduces the issue. To sum it up, if you query an object without any options and then you query it again but using options like `joinedload`, these are ignored, unless you do a session.expunge_all() or you delete the queried object from the local scope (by using `del` statement). |
From: Quentin G. (Sandhose) <iss...@bi...> - 2018-07-10 11:59:11
|
New issue 4300: Column defaults are dropped before the table itself https://bitbucket.org/zzzeek/sqlalchemy/issues/4300/column-defaults-are-dropped-before-the Quentin Gliech (Sandhose): When dropping a table, it first tries to drop the object associated with the `default` parameter of each column before dropping the table itself. The documentation gives [an example](http://docs.sqlalchemy.org/en/latest/core/defaults.html#associating-a-sequence-as-the-server-side-default) with a sequence that is used as a `default` and a `server_default`. In this particular example, the table will fail to drop with postgres because it first try to drop the sequence, which fails because it is still associated with the column. Here is a full example that illustrates this bug: ``` from sqlalchemy import create_engine, Table, Column, Sequence, Integer from sqlalchemy.schema import MetaData engine = create_engine('postgres+psycopg2://localhost/', echo=True) metadata = MetaData() table_id_seq = Sequence('table_id_seq', metadata=metadata) table = Table( 'table', metadata, Column( name='id', type_=Integer, default=table_id_seq, server_default=table_id_seq.next_value(), primary_key=True ) ) metadata.create_all(bind=engine) metadata.drop_all(bind=engine) # will fail # sqlalchemy.exc.InternalError: (psycopg2.InternalError) cannot drop sequence table_id_seq because other objects depend on it ``` This particular example runs with postgres using the psycopg2 driver, but other dialects might be affected by this. The full log and stacktrace is in the attachments. --- Looking at the code responsible of creating and dropping the tables, even though it seems like the [sequences are treated separately](https://bitbucket.org/zzzeek/sqlalchemy/src/260c604942bbdda1e4fbed951c2f591b825932e6/lib/sqlalchemy/sql/ddl.py#lines-903:912) and dropped after the table is dropped, they are dropped before because [the `default` field of each column is dropped](https://bitbucket.org/zzzeek/sqlalchemy/src/260c604942bbdda1e4fbed951c2f591b825932e6/lib/sqlalchemy/sql/ddl.py#lines-951:955) when visiting the table. --- ``` macOS 10.13.5 python 3.6.5 postgresql 10.4 SQLAlchemy 1.2.9 psycopg2-binary 2.7.5 ``` |
From: Michael B. <iss...@bi...> - 2018-07-09 22:28:32
|
New issue 4299: There is no way to create a foreign key to a BLANK_SCHEMA column name. https://bitbucket.org/zzzeek/sqlalchemy/issues/4299/there-is-no-way-to-create-a-foreign-key-to Michael Bayer: from #3978: There is no way to create a foreign key to a BLANK_SCHEMA column name. Similarly, the lookup in MetaData.tables is inconsistent vs. ForeignKey string lookup, inconsistent vs. declarative. These should be made completely consistent. The rule can be made as follows: 1. the MetaData.tables collection stays as a dictionary with a single, fully qualified key. I'd rather not make this dictionary something "magic", as particularly it needs to iterate accurately. 2. MetaData gets a new accessor resolve_table(<string>). Rules are: a. if MetaData has no "schema", this is a direct key into the .tables dictionary. b. string has no schema name. table returned is <metadata_schema_name>.table. if <metadata_schema_name>.table doesn't exist, raise an error. The error can include a note if there is a BLANK_SCHEMA.<tablename> present, but doesn't assume that's what the caller wants. c. string takes on special form "BLANK_SCHEMA.<tablename>". then we look up on "blank" schema. This also works in case "a.". not sure I like the actual symbol name there, need to think about it. Declarative needs to use resolve_table(). ForeignKey unfortunately needs to determine its exact schemaname.tablename.colname before the remote table potentially exists. ``` #!python from sqlalchemy import * m = MetaData(schema="foo") a1 = Table( 'a', m, Column('id', Integer, primary_key=True) ) a2 = Table( 'a', m, Column('id', Integer, primary_key=True), schema=BLANK_SCHEMA ) b = Table( 'b', m, Column('id', Integer, primary_key=True), Column('aid', ForeignKey('a.id')) ) assert list(b.c.aid.foreign_keys)[0].column is a1.c.id Table( 'c', m, Column('id', Integer, primary_key=True), Column('aid', ForeignKey('foo.a.id')) ) Table( 'd', m, Column('id', Integer, primary_key=True), Column('aid', ForeignKey(a2.c.id)) ) ``` |
From: Michael B. <iss...@bi...> - 2018-07-08 23:09:10
|
New issue 4298: regression in strategy pathing https://bitbucket.org/zzzeek/sqlalchemy/issues/4298/regression-in-strategy-pathing Michael Bayer: due to #4287 ``` #!python from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declared_attr Base = declarative_base() class A(Base): __tablename__ = 'a' id = Column(Integer, primary_key=True) data = Column(String) bs = relationship("B") class B(Base): __tablename__ = 'b' id = Column(Integer, primary_key=True) aid = Column(ForeignKey('a.id')) cs = relationship("C") class C(Base): __tablename__ = 'c' id = Column(Integer, primary_key=True) bid = Column(ForeignKey('b.id')) e = create_engine("sqlite://", echo=True) Base.metadata.create_all(e) s = Session(e) s.add(A(bs=[B(cs=[C()])])) s.commit() s.close() a1 = s.query(A).options(Load(A).lazyload("*")).first() a1.bs[0].cs ``` ``` #!python Traceback (most recent call last): File "test.py", line 40, in <module> a1.bs[0].cs File "/home/classic/dev/sqlalchemy/lib/sqlalchemy/orm/attributes.py", line 242, in __get__ return self.impl.get(instance_state(instance), dict_) File "/home/classic/dev/sqlalchemy/lib/sqlalchemy/orm/attributes.py", line 599, in get value = self.callable_(state, passive) File "/home/classic/dev/sqlalchemy/lib/sqlalchemy/orm/strategies.py", line 631, in _load_for_state session, state, primary_key_identity, passive) File "<string>", line 1, in <lambda> File "/home/classic/dev/sqlalchemy/lib/sqlalchemy/orm/strategies.py", line 713, in _emit_lazyload state.load_options, effective_path File "/home/classic/dev/sqlalchemy/lib/sqlalchemy/ext/baked.py", line 185, in _add_lazyload_options cache_key = opt._generate_cache_key(cache_path) File "/home/classic/dev/sqlalchemy/lib/sqlalchemy/orm/strategy_options.py", line 92, in _generate_cache_key chopped = self._chop_path(loader_path, path) File "/home/classic/dev/sqlalchemy/lib/sqlalchemy/orm/strategy_options.py", line 389, in _chop_path elif c_token.is_mapper and p_token.is_mapper and \ AttributeError: 'str' object has no attribute 'is_mapper' ``` |
From: marderko <iss...@bi...> - 2018-07-02 14:01:48
|
New issue 4297: Supporting Tests with Rollbacks fails https://bitbucket.org/zzzeek/sqlalchemy/issues/4297/supporting-tests-with-rollbacks-fails marderko: Founded bug in "Transactions and Connection Management" documentation http://docs.sqlalchemy.org/en/latest/orm/session_transaction.html section "Supporting Tests with Rollbacks". There is: ``` # then each time that SAVEPOINT ends, reopen it @event.listens_for(self.session, "after_transaction_end") def restart_savepoint(session, transaction): if transaction.nested and not transaction._parent.nested: # ensure that state is expired the way # session.commit() at the top level normally does # (optional step) session.expire_all() session.begin_nested() ``` I think the if condition is not correct and the right condition is: ``` if transaction.nested and not session.transaction.nested: ``` Explanation: There are constructed some transaction path (or tree) which have `session.transaction` in the end (tree leaf) and `session.transaction._parent._parent....._parent` in the start (tree root) and variable transaction from `restart_savepoint` is the start point (tree leaf). I think the second condition wants to restrict maximal length of path (or tree depth) to 2. But the condition is for path start and `session.begin_nested()` begins nested transaction in the end - so I change the condition also for the path end. I attached failing example with two factories (second has first as subfactory) and simple parametrized test. It is really slow and it fails for tests number > 919 because of maximal recursion depth. After condition change it is really quickly and no fail in any test. |
From: Shaun R. <iss...@bi...> - 2018-06-30 07:13:11
|
New issue 4296: Memory Leak in large table insertion https://bitbucket.org/zzzeek/sqlalchemy/issues/4296/memory-leak-in-large-table-insertion Shaun Rong: I was trying to insert a large pandas csv file (~200MB file) into a MySQL table with sqlalchemy. In the middle of running the script, I found the insertion program eats a huge chunk of the memory, and that in the end, the machine froze and I have to reboot the machine to kill the running program. To prove there's a memory leak, I wrote output to print out the available memories every 10k rows inserted from the pandas dataframe. I also collect garbages with `gc.collect()` to ensure this memory leakage doesn't come from elsewhere. The output are ``` #!txt Row No 0, CPU usage 49.9, Memory available 0.6730947909561938 Row No 100000, CPU usage 2.4, Memory available 0.620737552516592 Row No 200000, CPU usage 2.9, Memory available 0.5690685967649676 Row No 300000, CPU usage 2.5, Memory available 0.5178657630750353 Row No 400000, CPU usage 2.5, Memory available 0.4670138185985817 Row No 500000, CPU usage 2.2, Memory available 0.41836375584339547 Row No 600000, CPU usage 2.4, Memory available 0.36772255252178265 Row No 700000, CPU usage 2.5, Memory available 0.3198458994235243 ``` The codes executed are below. The machine is Ubuntu 16.04, 8G memory, the sqlalchemy version 1.2.9, python version 3.6.5. Driver is installed using `pip install mysql-connector-python` ``` #!python Ccm_Base = declarative_base() class MonthlyPriceTable(Ccm_Base): __tablename__ = 'monthly_price' gvkey = Column(Integer, primary_key=True) liid = Column(Integer, primary_key=True) lpermno = Column(Integer, primary_key=True) datadate = Column(Date, primary_key=True) ajexm = Column(Numeric(10, 6), nullable=False) spcsrc = Column(Integer) prccm_adj = Column(Numeric(16, 8), nullable=False) prchm_adj = Column(Numeric(16, 8), nullable=False) prclm_adj = Column(Numeric(16, 8), nullable=False) cheqvm_adj = Column(Numeric(8, 2), nullable=False) dvpspm_adj = Column(Numeric(8, 2), nullable=False) cshtrm_adj = Column(BigInteger) cshoq_adj = Column(Numeric(12, 6)) import pandas as pd from sqlalchemy import create_engine from sqlalchemy.orm import Session import argparse from settings import DB_USER, DB_PASSWORD, DB_HOST, DB_PORT, CCM_DB from settings import Monthly_Security_Table_Dir import psutil import gc def nan_converter(data): if pd.isnull(data): return None return data def dt_converter(ds): if pd.isnull(ds): return None return datetime.strptime(str(int(ds)), Date_Format).date() if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('-r', help='row number to start inserting', type=int, required=True) parser.add_argument('-f', help='output file', type=str, required=True) args = parser.parse_args() engine = create_engine("mysql+mysqlconnector://{}:{}@{}:{}/{}".format(DB_USER, DB_PASSWORD, DB_HOST, DB_PORT, CCM_DB)) df = pd.read_csv(Monthly_Security_Table_Dir) Ccm_Base.metadata.create_all(engine) sess = Session(bind=engine) for idx, row in df.loc[args.r:, :].iterrows(): price = MonthlyPriceTable(gvkey=row['GVKEY'], liid=row['LIID'], lpermno=row['LPERMNO'], datadate=dt_converter(row['DATADATE']), ajexm=row['AJEXM'], spcsrc=nan_converter(row['SPCSRC']), prccm_adj=row['PRCCM_ADJ'], prchm_adj=row['PRCHM_ADJ'], prclm_adj=row['PRCLM_ADJ'], cheqvm_adj=row['CHEQVM_ADJ'], dvpspm_adj=row['DVPSPM_ADJ'], cshtrm_adj=nan_converter(row['CSHTRM_ADJ']), cshoq_adj=nan_converter(row['CSHOQ_ADJ'])) sess.add(price) sess.flush() sess.commit() if idx % 100000 == 0: gc.collect() with open(args.f, 'a') as f: f.write("Row No {}, CPU usage {}, Memory available {}\n".format(idx, psutil.cpu_percent(), psutil.virtual_memory().available / psutil.virtual_memory().total)) ``` To run the scripts reproducing the results, please set DB access in settings.py and point Monthly_Security_Table_Dir to the csv file. Use command `python script.py -r 0 -f output_record.txt` to run script. The memory output is in the output_record.txt. The file I used is larger than 100MB so I can't upload it here. I uploaded in dropbox https://www.dropbox.com/s/vywopo1c0b1zrl5/security_monthly.csv?dl=0. |
From: Michael B. <iss...@bi...> - 2018-06-29 04:15:27
|
New issue 4295: Bundle w/ same name columns misbehaves https://bitbucket.org/zzzeek/sqlalchemy/issues/4295/bundle-w-same-name-columns-misbehaves Michael Bayer: ``` #!python from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declared_attr Base = declarative_base() class A(Base): __tablename__ = 'a' id = Column(Integer, primary_key=True) data = Column(String) bs = relationship("B") class B(A): __tablename__ = 'b' id = Column(Integer, ForeignKey('a.id'), primary_key=True) class C(A): __tablename__ = 'c' c_id = Column(Integer, ForeignKey('a.id'), primary_key=True) from sqlalchemy.sql.elements import ClauseList # ClauseList / Bundle are equivalent print(ClauseList(A.id, C.c_id)) print(Bundle("pk", A.id, C.c_id).__clause_element__()) # w/ same name, they are not because it creates the clause list using *c without using exprs print(ClauseList(A.id, B.id)) print(Bundle("pk", A.id, B.id).__clause_element__()) ``` output: ``` #!python a.id, c.c_id a.id, c.c_id a.id, b.id b.id ``` fix: ``` #!diff diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index 98747c680..0b6b32a07 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -1738,7 +1738,7 @@ class Query(object): self._group_by = False return - criterion = list(chain(*[_orm_columns(c) for c in criterion])) + criterion = c = list(chain(*[_orm_columns(c) for c in criterion])) criterion = self._adapt_col_list(criterion) if self._group_by is False: @@ -3964,7 +3964,7 @@ class Bundle(InspectionAttr): return cloned def __clause_element__(self): - return expression.ClauseList(group=False, *self.c) + return expression.ClauseList(group=False, *self.exprs) @property def clauses(self): ``` |
From: Eric A. <iss...@bi...> - 2018-06-29 02:48:49
|
New issue 4294: Group by with joined table inheritance doesn't work with PostgreSQL 10.4 and psycopg2==2.7.4 https://bitbucket.org/zzzeek/sqlalchemy/issues/4294/group-by-with-joined-table-inheritance Eric Atkin: Python 3.6.5 PostgreSQL 10.4 psycopg2==2.7.4 SQLAlchemy==1.2.7 Hi, In my example, C has a 1-to-1 relationship to the joined table inheritance model A/B and a 1-to-many relationship to D. As demonstrated below, when I want to query columns from C and A/B (specifically non-primary key columns from A) and aggregates from D, it results in a query that postgres considers an error because the `A.id` column isn't included in the group by clause by `.group_by(B.id)`. I do not get this error with the sqlite engine. Perhaps its planner is smarter. If I manually add `A.id` to the group by clause, it works as expected but this is problematic for two reasons. First, it is boilerplate that is error prone and second and more importantly, if the A/B model is aliased, I have no public API access that I know of to the aliased primary key columns for A (or other superclasses) in order to manually add them. It seems that the postgres engine needs to render the whole chain of primary key columns from a joined table inheritance model into the group by clause. I found this difficult to describe in english prose, so I hope the code below is sufficiently illustrative. Let me know what further clarification may be helpful. Thanks, Eric ``` #import sqlparse from pprint import pprint from sqlalchemy import * from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import * Base = declarative_base() class A(Base): id = Column(Integer, primary_key=True) a_attr = Column(String) polymorphic_type = Column(Text, nullable=False) __tablename__ = 'a' __mapper_args__ = { 'polymorphic_identity': 'a', 'polymorphic_on': 'polymorphic_type', } class B(A): id = Column(Integer, ForeignKey('a.id'), primary_key=True) b_attr = Column(String) __tablename__ = 'b' __mapper_args__ = {'polymorphic_identity': 'b'} class C(Base): id = Column(Integer, primary_key=True) b_id = Column(Integer, ForeignKey('b.id'), nullable=False) b = relationship('B') __tablename__ = 'c' class D(Base): id = Column(Integer, primary_key=True) c_id = Column(Integer, ForeignKey('c.id'), nullable=False) c = relationship('C') __tablename__ = 'd' #engine = create_engine('sqlite:///:memory:', echo=True) engine = create_engine('postgresql:///test', echo=True) Base.metadata.create_all(engine) session = sessionmaker(bind=engine)() count = 10 session.add_all(B(a_attr=f'a{i + 1}', b_attr=f'b{i + 1}') for i in range(count // 5)) session.add_all(C(b_id=i // 5 + 1) for i in range(count)) session.add_all(D(c_id=i + 1) for i in range(count) for j in range(count)) session.flush() query = ( session .query(C.id, B.id, B.a_attr, B.b_attr, func.count(D.id)) .join(B) .outerjoin(D) .group_by(C.id, B.id) .order_by(C.id) ) #print(sqlparse.format(str(query), reindent=True)) pprint(query.all()) session.commit() ``` ``` .../venv/lib/python3.6/site-packages/psycopg2/__init__.py:144: UserWarning: The psycopg2 wheel package will be renamed from release 2.8; in order to keep installing from binary please use "pip install psycopg2-binary" instead. For details see: <http://initd.org/psycopg/docs/install.html#binary-install-from-pypi>. """) 2018-06-28 20:35:53,426 INFO sqlalchemy.engine.base.Engine select version() 2018-06-28 20:35:53,426 INFO sqlalchemy.engine.base.Engine {} 2018-06-28 20:35:53,427 INFO sqlalchemy.engine.base.Engine select current_schema() 2018-06-28 20:35:53,427 INFO sqlalchemy.engine.base.Engine {} 2018-06-28 20:35:53,427 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1 2018-06-28 20:35:53,427 INFO sqlalchemy.engine.base.Engine {} 2018-06-28 20:35:53,428 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1 2018-06-28 20:35:53,428 INFO sqlalchemy.engine.base.Engine {} 2018-06-28 20:35:53,428 INFO sqlalchemy.engine.base.Engine show standard_conforming_strings 2018-06-28 20:35:53,428 INFO sqlalchemy.engine.base.Engine {} 2018-06-28 20:35:53,429 INFO sqlalchemy.engine.base.Engine select relname from pg_class c join pg_namespace n on n.oid=c.relnamespace where pg_catalog.pg_table_is_visible(c.oid) and relname=%(name)s 2018-06-28 20:35:53,429 INFO sqlalchemy.engine.base.Engine {'name': 'a'} 2018-06-28 20:35:53,429 INFO sqlalchemy.engine.base.Engine select relname from pg_class c join pg_namespace n on n.oid=c.relnamespace where pg_catalog.pg_table_is_visible(c.oid) and relname=%(name)s 2018-06-28 20:35:53,429 INFO sqlalchemy.engine.base.Engine {'name': 'b'} 2018-06-28 20:35:53,430 INFO sqlalchemy.engine.base.Engine select relname from pg_class c join pg_namespace n on n.oid=c.relnamespace where pg_catalog.pg_table_is_visible(c.oid) and relname=%(name)s 2018-06-28 20:35:53,430 INFO sqlalchemy.engine.base.Engine {'name': 'c'} 2018-06-28 20:35:53,430 INFO sqlalchemy.engine.base.Engine select relname from pg_class c join pg_namespace n on n.oid=c.relnamespace where pg_catalog.pg_table_is_visible(c.oid) and relname=%(name)s 2018-06-28 20:35:53,430 INFO sqlalchemy.engine.base.Engine {'name': 'd'} 2018-06-28 20:35:53,432 INFO sqlalchemy.engine.base.Engine CREATE TABLE a ( id SERIAL NOT NULL, a_attr VARCHAR, polymorphic_type TEXT NOT NULL, PRIMARY KEY (id) ) 2018-06-28 20:35:53,432 INFO sqlalchemy.engine.base.Engine {} 2018-06-28 20:35:53,435 INFO sqlalchemy.engine.base.Engine COMMIT 2018-06-28 20:35:53,436 INFO sqlalchemy.engine.base.Engine CREATE TABLE b ( id INTEGER NOT NULL, b_attr VARCHAR, PRIMARY KEY (id), FOREIGN KEY(id) REFERENCES a (id) ) 2018-06-28 20:35:53,436 INFO sqlalchemy.engine.base.Engine {} 2018-06-28 20:35:53,439 INFO sqlalchemy.engine.base.Engine COMMIT 2018-06-28 20:35:53,441 INFO sqlalchemy.engine.base.Engine CREATE TABLE c ( id SERIAL NOT NULL, b_id INTEGER NOT NULL, PRIMARY KEY (id), FOREIGN KEY(b_id) REFERENCES b (id) ) 2018-06-28 20:35:53,441 INFO sqlalchemy.engine.base.Engine {} 2018-06-28 20:35:53,444 INFO sqlalchemy.engine.base.Engine COMMIT 2018-06-28 20:35:53,446 INFO sqlalchemy.engine.base.Engine CREATE TABLE d ( id SERIAL NOT NULL, c_id INTEGER NOT NULL, PRIMARY KEY (id), FOREIGN KEY(c_id) REFERENCES c (id) ) 2018-06-28 20:35:53,446 INFO sqlalchemy.engine.base.Engine {} 2018-06-28 20:35:53,448 INFO sqlalchemy.engine.base.Engine COMMIT 2018-06-28 20:35:53,455 INFO sqlalchemy.engine.base.Engine BEGIN (implicit) 2018-06-28 20:35:53,456 INFO sqlalchemy.engine.base.Engine INSERT INTO a (a_attr, polymorphic_type) VALUES (%(a_attr)s, %(polymorphic_type)s) RETURNING a.id 2018-06-28 20:35:53,456 INFO sqlalchemy.engine.base.Engine {'a_attr': 'a1', 'polymorphic_type': 'b'} 2018-06-28 20:35:53,456 INFO sqlalchemy.engine.base.Engine INSERT INTO a (a_attr, polymorphic_type) VALUES (%(a_attr)s, %(polymorphic_type)s) RETURNING a.id 2018-06-28 20:35:53,456 INFO sqlalchemy.engine.base.Engine {'a_attr': 'a2', 'polymorphic_type': 'b'} 2018-06-28 20:35:53,457 INFO sqlalchemy.engine.base.Engine INSERT INTO b (id, b_attr) VALUES (%(id)s, %(b_attr)s) 2018-06-28 20:35:53,457 INFO sqlalchemy.engine.base.Engine ({'id': 1, 'b_attr': 'b1'}, {'id': 2, 'b_attr': 'b2'}) 2018-06-28 20:35:53,458 INFO sqlalchemy.engine.base.Engine INSERT INTO c (b_id) VALUES (%(b_id)s) RETURNING c.id 2018-06-28 20:35:53,458 INFO sqlalchemy.engine.base.Engine {'b_id': 1} 2018-06-28 20:35:53,459 INFO sqlalchemy.engine.base.Engine INSERT INTO c (b_id) VALUES (%(b_id)s) RETURNING c.id 2018-06-28 20:35:53,459 INFO sqlalchemy.engine.base.Engine {'b_id': 1} 2018-06-28 20:35:53,459 INFO sqlalchemy.engine.base.Engine INSERT INTO c (b_id) VALUES (%(b_id)s) RETURNING c.id 2018-06-28 20:35:53,459 INFO sqlalchemy.engine.base.Engine {'b_id': 1} 2018-06-28 20:35:53,459 INFO sqlalchemy.engine.base.Engine INSERT INTO c (b_id) VALUES (%(b_id)s) RETURNING c.id 2018-06-28 20:35:53,459 INFO sqlalchemy.engine.base.Engine {'b_id': 1} 2018-06-28 20:35:53,460 INFO sqlalchemy.engine.base.Engine INSERT INTO c (b_id) VALUES (%(b_id)s) RETURNING c.id 2018-06-28 20:35:53,460 INFO sqlalchemy.engine.base.Engine {'b_id': 1} 2018-06-28 20:35:53,460 INFO sqlalchemy.engine.base.Engine INSERT INTO c (b_id) VALUES (%(b_id)s) RETURNING c.id 2018-06-28 20:35:53,460 INFO sqlalchemy.engine.base.Engine {'b_id': 2} 2018-06-28 20:35:53,460 INFO sqlalchemy.engine.base.Engine INSERT INTO c (b_id) VALUES (%(b_id)s) RETURNING c.id 2018-06-28 20:35:53,460 INFO sqlalchemy.engine.base.Engine {'b_id': 2} 2018-06-28 20:35:53,460 INFO sqlalchemy.engine.base.Engine INSERT INTO c (b_id) VALUES (%(b_id)s) RETURNING c.id 2018-06-28 20:35:53,460 INFO sqlalchemy.engine.base.Engine {'b_id': 2} 2018-06-28 20:35:53,461 INFO sqlalchemy.engine.base.Engine INSERT INTO c (b_id) VALUES (%(b_id)s) RETURNING c.id 2018-06-28 20:35:53,461 INFO sqlalchemy.engine.base.Engine {'b_id': 2} 2018-06-28 20:35:53,461 INFO sqlalchemy.engine.base.Engine INSERT INTO c (b_id) VALUES (%(b_id)s) RETURNING c.id 2018-06-28 20:35:53,461 INFO sqlalchemy.engine.base.Engine {'b_id': 2} 2018-06-28 20:35:53,462 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,462 INFO sqlalchemy.engine.base.Engine {'c_id': 1} 2018-06-28 20:35:53,462 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,462 INFO sqlalchemy.engine.base.Engine {'c_id': 1} 2018-06-28 20:35:53,463 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,463 INFO sqlalchemy.engine.base.Engine {'c_id': 1} 2018-06-28 20:35:53,463 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,463 INFO sqlalchemy.engine.base.Engine {'c_id': 1} 2018-06-28 20:35:53,463 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,463 INFO sqlalchemy.engine.base.Engine {'c_id': 1} 2018-06-28 20:35:53,463 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,463 INFO sqlalchemy.engine.base.Engine {'c_id': 1} 2018-06-28 20:35:53,464 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,464 INFO sqlalchemy.engine.base.Engine {'c_id': 1} 2018-06-28 20:35:53,465 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,465 INFO sqlalchemy.engine.base.Engine {'c_id': 1} 2018-06-28 20:35:53,465 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,465 INFO sqlalchemy.engine.base.Engine {'c_id': 1} 2018-06-28 20:35:53,465 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,465 INFO sqlalchemy.engine.base.Engine {'c_id': 1} 2018-06-28 20:35:53,466 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,466 INFO sqlalchemy.engine.base.Engine {'c_id': 2} 2018-06-28 20:35:53,466 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,466 INFO sqlalchemy.engine.base.Engine {'c_id': 2} 2018-06-28 20:35:53,466 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,466 INFO sqlalchemy.engine.base.Engine {'c_id': 2} 2018-06-28 20:35:53,467 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,467 INFO sqlalchemy.engine.base.Engine {'c_id': 2} 2018-06-28 20:35:53,467 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,467 INFO sqlalchemy.engine.base.Engine {'c_id': 2} 2018-06-28 20:35:53,467 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,467 INFO sqlalchemy.engine.base.Engine {'c_id': 2} 2018-06-28 20:35:53,467 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,467 INFO sqlalchemy.engine.base.Engine {'c_id': 2} 2018-06-28 20:35:53,468 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,468 INFO sqlalchemy.engine.base.Engine {'c_id': 2} 2018-06-28 20:35:53,468 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,468 INFO sqlalchemy.engine.base.Engine {'c_id': 2} 2018-06-28 20:35:53,468 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,468 INFO sqlalchemy.engine.base.Engine {'c_id': 2} 2018-06-28 20:35:53,468 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,468 INFO sqlalchemy.engine.base.Engine {'c_id': 3} 2018-06-28 20:35:53,468 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,468 INFO sqlalchemy.engine.base.Engine {'c_id': 3} 2018-06-28 20:35:53,469 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,469 INFO sqlalchemy.engine.base.Engine {'c_id': 3} 2018-06-28 20:35:53,469 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,469 INFO sqlalchemy.engine.base.Engine {'c_id': 3} 2018-06-28 20:35:53,469 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,469 INFO sqlalchemy.engine.base.Engine {'c_id': 3} 2018-06-28 20:35:53,469 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,469 INFO sqlalchemy.engine.base.Engine {'c_id': 3} 2018-06-28 20:35:53,469 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,469 INFO sqlalchemy.engine.base.Engine {'c_id': 3} 2018-06-28 20:35:53,470 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,470 INFO sqlalchemy.engine.base.Engine {'c_id': 3} 2018-06-28 20:35:53,470 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,470 INFO sqlalchemy.engine.base.Engine {'c_id': 3} 2018-06-28 20:35:53,470 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,470 INFO sqlalchemy.engine.base.Engine {'c_id': 3} 2018-06-28 20:35:53,470 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,470 INFO sqlalchemy.engine.base.Engine {'c_id': 4} 2018-06-28 20:35:53,470 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,470 INFO sqlalchemy.engine.base.Engine {'c_id': 4} 2018-06-28 20:35:53,471 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,471 INFO sqlalchemy.engine.base.Engine {'c_id': 4} 2018-06-28 20:35:53,471 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,471 INFO sqlalchemy.engine.base.Engine {'c_id': 4} 2018-06-28 20:35:53,471 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,471 INFO sqlalchemy.engine.base.Engine {'c_id': 4} 2018-06-28 20:35:53,471 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,471 INFO sqlalchemy.engine.base.Engine {'c_id': 4} 2018-06-28 20:35:53,472 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,472 INFO sqlalchemy.engine.base.Engine {'c_id': 4} 2018-06-28 20:35:53,472 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,472 INFO sqlalchemy.engine.base.Engine {'c_id': 4} 2018-06-28 20:35:53,472 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,472 INFO sqlalchemy.engine.base.Engine {'c_id': 4} 2018-06-28 20:35:53,473 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,473 INFO sqlalchemy.engine.base.Engine {'c_id': 4} 2018-06-28 20:35:53,473 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,473 INFO sqlalchemy.engine.base.Engine {'c_id': 5} 2018-06-28 20:35:53,473 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,473 INFO sqlalchemy.engine.base.Engine {'c_id': 5} 2018-06-28 20:35:53,474 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,474 INFO sqlalchemy.engine.base.Engine {'c_id': 5} 2018-06-28 20:35:53,474 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,474 INFO sqlalchemy.engine.base.Engine {'c_id': 5} 2018-06-28 20:35:53,475 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,475 INFO sqlalchemy.engine.base.Engine {'c_id': 5} 2018-06-28 20:35:53,475 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,475 INFO sqlalchemy.engine.base.Engine {'c_id': 5} 2018-06-28 20:35:53,476 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,476 INFO sqlalchemy.engine.base.Engine {'c_id': 5} 2018-06-28 20:35:53,477 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,477 INFO sqlalchemy.engine.base.Engine {'c_id': 5} 2018-06-28 20:35:53,478 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,478 INFO sqlalchemy.engine.base.Engine {'c_id': 5} 2018-06-28 20:35:53,479 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,479 INFO sqlalchemy.engine.base.Engine {'c_id': 5} 2018-06-28 20:35:53,480 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,480 INFO sqlalchemy.engine.base.Engine {'c_id': 6} 2018-06-28 20:35:53,480 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,480 INFO sqlalchemy.engine.base.Engine {'c_id': 6} 2018-06-28 20:35:53,480 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,480 INFO sqlalchemy.engine.base.Engine {'c_id': 6} 2018-06-28 20:35:53,481 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,481 INFO sqlalchemy.engine.base.Engine {'c_id': 6} 2018-06-28 20:35:53,481 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,481 INFO sqlalchemy.engine.base.Engine {'c_id': 6} 2018-06-28 20:35:53,481 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,481 INFO sqlalchemy.engine.base.Engine {'c_id': 6} 2018-06-28 20:35:53,482 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,482 INFO sqlalchemy.engine.base.Engine {'c_id': 6} 2018-06-28 20:35:53,482 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,482 INFO sqlalchemy.engine.base.Engine {'c_id': 6} 2018-06-28 20:35:53,482 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,482 INFO sqlalchemy.engine.base.Engine {'c_id': 6} 2018-06-28 20:35:53,482 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,482 INFO sqlalchemy.engine.base.Engine {'c_id': 6} 2018-06-28 20:35:53,483 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,483 INFO sqlalchemy.engine.base.Engine {'c_id': 7} 2018-06-28 20:35:53,483 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,483 INFO sqlalchemy.engine.base.Engine {'c_id': 7} 2018-06-28 20:35:53,483 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,483 INFO sqlalchemy.engine.base.Engine {'c_id': 7} 2018-06-28 20:35:53,483 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,484 INFO sqlalchemy.engine.base.Engine {'c_id': 7} 2018-06-28 20:35:53,484 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,484 INFO sqlalchemy.engine.base.Engine {'c_id': 7} 2018-06-28 20:35:53,484 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,484 INFO sqlalchemy.engine.base.Engine {'c_id': 7} 2018-06-28 20:35:53,484 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,484 INFO sqlalchemy.engine.base.Engine {'c_id': 7} 2018-06-28 20:35:53,484 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,484 INFO sqlalchemy.engine.base.Engine {'c_id': 7} 2018-06-28 20:35:53,485 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,485 INFO sqlalchemy.engine.base.Engine {'c_id': 7} 2018-06-28 20:35:53,485 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,485 INFO sqlalchemy.engine.base.Engine {'c_id': 7} 2018-06-28 20:35:53,485 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,485 INFO sqlalchemy.engine.base.Engine {'c_id': 8} 2018-06-28 20:35:53,485 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,485 INFO sqlalchemy.engine.base.Engine {'c_id': 8} 2018-06-28 20:35:53,486 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,486 INFO sqlalchemy.engine.base.Engine {'c_id': 8} 2018-06-28 20:35:53,486 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,486 INFO sqlalchemy.engine.base.Engine {'c_id': 8} 2018-06-28 20:35:53,486 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,486 INFO sqlalchemy.engine.base.Engine {'c_id': 8} 2018-06-28 20:35:53,486 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,486 INFO sqlalchemy.engine.base.Engine {'c_id': 8} 2018-06-28 20:35:53,486 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,486 INFO sqlalchemy.engine.base.Engine {'c_id': 8} 2018-06-28 20:35:53,487 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,487 INFO sqlalchemy.engine.base.Engine {'c_id': 8} 2018-06-28 20:35:53,487 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,487 INFO sqlalchemy.engine.base.Engine {'c_id': 8} 2018-06-28 20:35:53,487 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,487 INFO sqlalchemy.engine.base.Engine {'c_id': 8} 2018-06-28 20:35:53,487 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,487 INFO sqlalchemy.engine.base.Engine {'c_id': 9} 2018-06-28 20:35:53,487 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,487 INFO sqlalchemy.engine.base.Engine {'c_id': 9} 2018-06-28 20:35:53,488 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,488 INFO sqlalchemy.engine.base.Engine {'c_id': 9} 2018-06-28 20:35:53,488 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,488 INFO sqlalchemy.engine.base.Engine {'c_id': 9} 2018-06-28 20:35:53,488 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,488 INFO sqlalchemy.engine.base.Engine {'c_id': 9} 2018-06-28 20:35:53,488 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,488 INFO sqlalchemy.engine.base.Engine {'c_id': 9} 2018-06-28 20:35:53,489 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,489 INFO sqlalchemy.engine.base.Engine {'c_id': 9} 2018-06-28 20:35:53,489 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,489 INFO sqlalchemy.engine.base.Engine {'c_id': 9} 2018-06-28 20:35:53,489 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,489 INFO sqlalchemy.engine.base.Engine {'c_id': 9} 2018-06-28 20:35:53,489 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,489 INFO sqlalchemy.engine.base.Engine {'c_id': 9} 2018-06-28 20:35:53,490 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,490 INFO sqlalchemy.engine.base.Engine {'c_id': 10} 2018-06-28 20:35:53,490 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,490 INFO sqlalchemy.engine.base.Engine {'c_id': 10} 2018-06-28 20:35:53,490 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,490 INFO sqlalchemy.engine.base.Engine {'c_id': 10} 2018-06-28 20:35:53,490 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,490 INFO sqlalchemy.engine.base.Engine {'c_id': 10} 2018-06-28 20:35:53,491 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,491 INFO sqlalchemy.engine.base.Engine {'c_id': 10} 2018-06-28 20:35:53,491 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,491 INFO sqlalchemy.engine.base.Engine {'c_id': 10} 2018-06-28 20:35:53,491 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,491 INFO sqlalchemy.engine.base.Engine {'c_id': 10} 2018-06-28 20:35:53,491 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,491 INFO sqlalchemy.engine.base.Engine {'c_id': 10} 2018-06-28 20:35:53,491 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,491 INFO sqlalchemy.engine.base.Engine {'c_id': 10} 2018-06-28 20:35:53,492 INFO sqlalchemy.engine.base.Engine INSERT INTO d (c_id) VALUES (%(c_id)s) RETURNING d.id 2018-06-28 20:35:53,492 INFO sqlalchemy.engine.base.Engine {'c_id': 10} 2018-06-28 20:35:53,494 INFO sqlalchemy.engine.base.Engine SELECT c.id AS c_id, b.id AS b_id, a.a_attr AS a_a_attr, b.b_attr AS b_b_attr, count(d.id) AS count_1 FROM c JOIN (a JOIN b ON a.id = b.id) ON b.id = c.b_id LEFT OUTER JOIN d ON c.id = d.c_id GROUP BY c.id, b.id ORDER BY c.id 2018-06-28 20:35:53,494 INFO sqlalchemy.engine.base.Engine {} Traceback (most recent call last): File ".../venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1193, in _execute_context context) File ".../venv/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 507, in do_execute cursor.execute(statement, parameters) psycopg2.ProgrammingError: column "a.a_attr" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: SELECT c.id AS c_id, b.id AS b_id, a.a_attr AS a_a_attr, b.b... ^ The above exception was the direct cause of the following exception: Traceback (most recent call last): File "group_by_joined_table_inheritance.py", line 61, in <module> pprint(query.all()) File ".../venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 2773, in all return list(self) File ".../venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 2925, in __iter__ return self._execute_and_instances(context) File ".../venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 2948, in _execute_and_instances result = conn.execute(querycontext.statement, self._params) File ".../venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 948, in execute return meth(self, multiparams, params) File ".../venv/lib/python3.6/site-packages/sqlalchemy/sql/elements.py", line 269, in _execute_on_connection return connection._execute_clauseelement(self, multiparams, params) File ".../venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1060, in _execute_clauseelement compiled_sql, distilled_params File ".../venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1200, in _execute_context context) File ".../venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1413, in _handle_dbapi_exception exc_info File ".../venv/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 203, in raise_from_cause reraise(type(exception), exception, tb=exc_tb, cause=cause) File ".../venv/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 186, in reraise raise value.with_traceback(tb) File ".../venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1193, in _execute_context context) File ".../venv/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 507, in do_execute cursor.execute(statement, parameters) sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) column "a.a_attr" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: SELECT c.id AS c_id, b.id AS b_id, a.a_attr AS a_a_attr, b.b... ^ [SQL: 'SELECT c.id AS c_id, b.id AS b_id, a.a_attr AS a_a_attr, b.b_attr AS b_b_attr, count(d.id) AS count_1 \nFROM c JOIN (a JOIN b ON a.id = b.id) ON b.id = c.b_id LEFT OUTER JOIN d ON c.id = d.c_id GROUP BY c.id, b.id ORDER BY c.id'] (Background on this error at: http://sqlalche.me/e/f405) ``` |
From: Michael B. <iss...@bi...> - 2018-06-28 17:57:09
|
New issue 4293: mysql 8.0 reports DESC etc. for columns in indexes https://bitbucket.org/zzzeek/sqlalchemy/issues/4293/mysql-80-reports-desc-etc-for-columns-in Michael Bayer: Postgresql dialect supports this, so for mysql8.0 we have to ramp up the parsing: ``` #!python from sqlalchemy import * m1 = MetaData() t1 = Table( 'add_ix', m1, Column('x', String(50)), mysql_engine='InnoDB') Index('foo_idx', t1.c.x.desc()) for url in [ "postgresql://scott:tiger@localhost/test", "mysql://scott:tiger@mysql57/test", "mysql://scott:tiger@mysql80/test", ]: e = create_engine(url) m1.drop_all(e) m1.create_all(e) insp = inspect(e) assert \ insp.get_indexes("add_ix") == \ [{'name': 'foo_idx', 'unique': False, 'column_names': ['x']}], \ "failed on %s" % url ``` |
From: Michael D. M. <iss...@bi...> - 2018-06-28 15:26:29
|
New issue 4292: execute fails on postgres if % in statement and no parameters https://bitbucket.org/zzzeek/sqlalchemy/issues/4292/execute-fails-on-postgres-if-in-statement Michael Del Monte: This fails import sqlalchemy e = sqlalchemy.create_engine("postgresql://postgres@localhost:5432/postgres") e.scalar("select 1 where 'a' like 'a%'") with TypeError: 'dict' object does not support indexing because the underlying execution context wants positional arguments so it supplies an empty dict as the "parameters" argument, but psycopg2.cursor.execute wants a tuple. |
From: Robert S. <iss...@bi...> - 2018-06-28 08:52:49
|
New issue 4291: Test failures with Python 3.7 https://bitbucket.org/zzzeek/sqlalchemy/issues/4291/test-failures-with-python-37 Robert Schütz: When I run the tests of SQLAlchemy's latest version using Python 3.7, I get ``` ============================= test session starts ============================== platform linux -- Python 3.7.0, pytest-3.6.2, py-1.5.3, pluggy-0.6.0 -- /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/bin/python3.7m cachedir: .pytest_cache rootdir: /build/SQLAlchemy-1.2.8, inifile: setup.cfg collecting ... ==================================== ERRORS ==================================== _____________ ERROR collecting test/aaa_profiling/test_memusage.py _____________ test/aaa_profiling/test_memusage.py:168: in <module> class MemUsageTest(EnsureZeroed): test/aaa_profiling/test_memusage.py:182: in MemUsageTest @testing.requires.cextensions /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/testing/exclusions.py:96: in __call__ decorated = decorate(fn) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly __________________ ERROR collecting test/base/test_events.py ___________________ test/base/test_events.py:1094: in <module> class RemovalTest(fixtures.TestBase): test/base/test_events.py:1247: in RemovalTest @testing.requires.predictable_gc /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/testing/exclusions.py:96: in __call__ decorated = decorate(fn) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly ___________________ ERROR collecting test/base/test_utils.py ___________________ test/base/test_utils.py:135: in <module> class WeakSequenceTest(fixtures.TestBase): test/base/test_utils.py:136: in WeakSequenceTest @testing.requires.predictable_gc /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/testing/exclusions.py:96: in __call__ decorated = decorate(fn) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly ________________ ERROR collecting test/dialect/test_firebird.py ________________ test/dialect/test_firebird.py:3: in <module> from sqlalchemy.databases import firebird /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/databases/__init__.py:13: in <module> from ..dialects.postgresql import base as postgresql /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__init__.py:8: in <module> from . import base, psycopg2, pg8000, pypostgresql, pygresql, \ /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/base.py:2153: in <module> class PGDialect(default.DefaultDialect): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/base.py:2436: in PGDialect def get_table_oid(self, connection, table_name, schema=None, **kw): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly _________________ ERROR collecting test/dialect/test_sqlite.py _________________ test/dialect/test_sqlite.py:28: in <module> class TestTypes(fixtures.TestBase, AssertsExecutionResults): test/dialect/test_sqlite.py:107: in TestTypes @testing.provide_metadata /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly _________________ ERROR collecting test/dialect/test_suite.py __________________ test/dialect/test_suite.py:1: in <module> from sqlalchemy.testing.suite import * /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/testing/suite/__init__.py:2: in <module> from sqlalchemy.testing.suite.test_dialect import * /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/testing/suite/test_dialect.py:11: in <module> class ExceptionTest(fixtures.TablesTest): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/testing/suite/test_dialect.py:29: in ExceptionTest @requirements.duplicate_key_raises_integrity_error /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/testing/exclusions.py:96: in __call__ decorated = decorate(fn) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly _________________ ERROR collecting test/dialect/test_sybase.py _________________ test/dialect/test_sybase.py:3: in <module> from sqlalchemy.databases import sybase /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/databases/__init__.py:13: in <module> from ..dialects.postgresql import base as postgresql /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__init__.py:8: in <module> from . import base, psycopg2, pg8000, pypostgresql, pygresql, \ /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/base.py:2153: in <module> class PGDialect(default.DefaultDialect): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/base.py:2436: in PGDialect def get_table_oid(self, connection, table_name, schema=None, **kw): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly _____________ ERROR collecting test/dialect/mssql/test_compiler.py _____________ test/dialect/mssql/test_compiler.py:5: in <module> from sqlalchemy.dialects import mssql /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/__init__.py:8: in <module> from . import base, pyodbc, adodbapi, pymssql, zxjdbc, mxodbc # noqa /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/base.py:1802: in <module> class MSDialect(default.DefaultDialect): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/base.py:1982: in MSDialect @reflection.cache /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly ______________ ERROR collecting test/dialect/mssql/test_engine.py ______________ test/dialect/mssql/test_engine.py:5: in <module> from sqlalchemy.dialects.mssql import pyodbc, pymssql, adodbapi /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/__init__.py:8: in <module> from . import base, pyodbc, adodbapi, pymssql, zxjdbc, mxodbc # noqa /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/base.py:1802: in <module> class MSDialect(default.DefaultDialect): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/base.py:1982: in MSDialect @reflection.cache /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly ______________ ERROR collecting test/dialect/mssql/test_query.py _______________ test/dialect/mssql/test_query.py:4: in <module> from sqlalchemy.databases import mssql /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/databases/__init__.py:13: in <module> from ..dialects.postgresql import base as postgresql /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__init__.py:8: in <module> from . import base, psycopg2, pg8000, pypostgresql, pygresql, \ /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/base.py:2153: in <module> class PGDialect(default.DefaultDialect): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/base.py:2436: in PGDialect def get_table_oid(self, connection, table_name, schema=None, **kw): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly ____________ ERROR collecting test/dialect/mssql/test_reflection.py ____________ test/dialect/mssql/test_reflection.py:5: in <module> from sqlalchemy.databases import mssql /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/databases/__init__.py:13: in <module> from ..dialects.postgresql import base as postgresql /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__init__.py:8: in <module> from . import base, psycopg2, pg8000, pypostgresql, pygresql, \ /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/base.py:2153: in <module> class PGDialect(default.DefaultDialect): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/base.py:2436: in PGDialect def get_table_oid(self, connection, table_name, schema=None, **kw): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly ______________ ERROR collecting test/dialect/mssql/test_types.py _______________ test/dialect/mssql/test_types.py:10: in <module> from sqlalchemy.dialects.mssql import TIMESTAMP, ROWVERSION /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/__init__.py:8: in <module> from . import base, pyodbc, adodbapi, pymssql, zxjdbc, mxodbc # noqa /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/base.py:1802: in <module> class MSDialect(default.DefaultDialect): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/base.py:1982: in MSDialect @reflection.cache /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly _____________ ERROR collecting test/dialect/mysql/test_compiler.py _____________ test/dialect/mysql/test_compiler.py:13: in <module> from sqlalchemy.dialects.mysql import insert /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/__init__.py:8: in <module> from . import base, mysqldb, oursql, \ /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/base.py:1643: in <module> class MySQLDialect(default.DefaultDialect): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/base.py:1959: in MySQLDialect @reflection.cache /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly _____________ ERROR collecting test/dialect/mysql/test_dialect.py ______________ test/dialect/mysql/test_dialect.py:9: in <module> from ...engine import test_execute <frozen importlib._bootstrap>:983: in _find_and_load ??? <frozen importlib._bootstrap>:967: in _find_and_load_unlocked ??? <frozen importlib._bootstrap>:668: in _load_unlocked ??? <frozen importlib._bootstrap>:638: in _load_backward_compatible ??? /nix/store/kc826j8kxs4kfhipjg99a3c9wdwm2a7v-python3.7-pytest-3.6.2/lib/python3.7/site-packages/_pytest/assertion/rewrite.py:216: in load_module py.builtin.exec_(co, mod.__dict__) test/engine/test_execute.py:20: in <module> from sqlalchemy.dialects.oracle.zxjdbc import ReturningParam /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/__init__.py:8: in <module> from . import base, cx_oracle, zxjdbc # noqa /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/base.py:1025: in <module> class OracleDialect(default.DefaultDialect): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/base.py:1219: in OracleDialect resolve_synonyms=False, dblink='', **kw): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly ___________ ERROR collecting test/dialect/mysql/test_on_duplicate.py ___________ test/dialect/mysql/test_on_duplicate.py:4: in <module> from sqlalchemy.dialects.mysql import insert /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/__init__.py:8: in <module> from . import base, mysqldb, oursql, \ /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/base.py:1643: in <module> class MySQLDialect(default.DefaultDialect): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/base.py:1959: in MySQLDialect @reflection.cache /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly ______________ ERROR collecting test/dialect/mysql/test_query.py _______________ test/dialect/mysql/test_query.py:9: in <module> class IdiosyncrasyTest(fixtures.TestBase): test/dialect/mysql/test_query.py:13: in IdiosyncrasyTest @testing.emits_warning() /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly ____________ ERROR collecting test/dialect/mysql/test_reflection.py ____________ test/dialect/mysql/test_reflection.py:12: in <module> from sqlalchemy.dialects.mysql import base as mysql /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/__init__.py:8: in <module> from . import base, mysqldb, oursql, \ /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/base.py:1643: in <module> class MySQLDialect(default.DefaultDialect): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/base.py:1959: in MySQLDialect @reflection.cache /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly ______________ ERROR collecting test/dialect/mysql/test_types.py _______________ test/dialect/mysql/test_types.py:8: in <module> from sqlalchemy.dialects.mysql import base as mysql /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/__init__.py:8: in <module> from . import base, mysqldb, oursql, \ /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/base.py:1643: in <module> class MySQLDialect(default.DefaultDialect): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/base.py:1959: in MySQLDialect @reflection.cache /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly ____________ ERROR collecting test/dialect/oracle/test_compiler.py _____________ test/dialect/oracle/test_compiler.py:23: in <module> from sqlalchemy.dialects.oracle import cx_oracle, base as oracle /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/__init__.py:8: in <module> from . import base, cx_oracle, zxjdbc # noqa /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/base.py:1025: in <module> class OracleDialect(default.DefaultDialect): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/base.py:1219: in OracleDialect resolve_synonyms=False, dblink='', **kw): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly _____________ ERROR collecting test/dialect/oracle/test_dialect.py _____________ test/dialect/oracle/test_dialect.py:22: in <module> from sqlalchemy.dialects.oracle import cx_oracle, base as oracle /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/__init__.py:8: in <module> from . import base, cx_oracle, zxjdbc # noqa /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/base.py:1025: in <module> class OracleDialect(default.DefaultDialect): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/base.py:1219: in OracleDialect resolve_synonyms=False, dblink='', **kw): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly ___________ ERROR collecting test/dialect/oracle/test_reflection.py ____________ test/dialect/oracle/test_reflection.py:16: in <module> from sqlalchemy.dialects.oracle.base import NUMBER, BINARY_DOUBLE, \ /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/__init__.py:8: in <module> from . import base, cx_oracle, zxjdbc # noqa /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/base.py:1025: in <module> class OracleDialect(default.DefaultDialect): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/base.py:1219: in OracleDialect resolve_synonyms=False, dblink='', **kw): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly ______________ ERROR collecting test/dialect/oracle/test_types.py ______________ test/dialect/oracle/test_types.py:23: in <module> from sqlalchemy.dialects.oracle import cx_oracle, base as oracle /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/__init__.py:8: in <module> from . import base, cx_oracle, zxjdbc # noqa /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/base.py:1025: in <module> class OracleDialect(default.DefaultDialect): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/base.py:1219: in OracleDialect resolve_synonyms=False, dblink='', **kw): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly __________ ERROR collecting test/dialect/postgresql/test_compiler.py ___________ test/dialect/postgresql/test_compiler.py:10: in <module> from sqlalchemy.dialects.postgresql import ExcludeConstraint, array /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__init__.py:8: in <module> from . import base, psycopg2, pg8000, pypostgresql, pygresql, \ /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/base.py:2153: in <module> class PGDialect(default.DefaultDialect): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/base.py:2436: in PGDialect def get_table_oid(self, connection, table_name, schema=None, **kw): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly ___________ ERROR collecting test/dialect/postgresql/test_dialect.py ___________ test/dialect/postgresql/test_dialect.py:14: in <module> from sqlalchemy.dialects.postgresql import base as postgresql /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__init__.py:8: in <module> from . import base, psycopg2, pg8000, pypostgresql, pygresql, \ /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/base.py:2153: in <module> class PGDialect(default.DefaultDialect): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/base.py:2436: in PGDialect def get_table_oid(self, connection, table_name, schema=None, **kw): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly _________ ERROR collecting test/dialect/postgresql/test_on_conflict.py _________ test/dialect/postgresql/test_on_conflict.py:8: in <module> from sqlalchemy.dialects.postgresql import insert /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__init__.py:8: in <module> from . import base, psycopg2, pg8000, pypostgresql, pygresql, \ /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/base.py:2153: in <module> class PGDialect(default.DefaultDialect): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/base.py:2436: in PGDialect def get_table_oid(self, connection, table_name, schema=None, **kw): /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:128: in decorate metadata.update(format_argspec_plus(spec, grouped=False)) /nix/store/qbjcg17f4605zx5gmkfg1z7i2j3zflwm-python3.7-SQLAlchemy-1.2.8/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py:374: in format_argspec_plus args = inspect.formatargspec(*spec) /nix/store/3hkchkmcz4kjldka2jpvfibpz12w847g-python3-3.7.0/lib/python3.7/inspect.py:1225: in formatargspec stacklevel=2) E DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly =========================== 25 error in 5.45 seconds =========================== ``` The same errors appear when running the tests from latest master. |
From: Michael B. <iss...@bi...> - 2018-06-26 20:11:58
|
New issue 4290: add setinputsizes() hook for cx_oracle https://bitbucket.org/zzzeek/sqlalchemy/issues/4290/add-setinputsizes-hook-for-cx_oracle Michael Bayer: apparently we cannot generalize the setinputsizes() decision for cx_Oracle datatypes. after many issues reported (by me): https://github.com/oracle/python-cx_Oracle/issues/68 https://github.com/oracle/python-cx_Oracle/issues/75 https://github.com/oracle/python-cx_Oracle/issues/181 https://github.com/oracle/python-cx_Oracle/issues/189 as of issue 189 above it's clear that there are just some cases where we can't even make an accurate decision, not to mention as cx_Oracle, the Oracle version in use, and settings like charset and numeric settings change, whether or not and how to use setinputsizes with cx_oracle is something that needs constant adjustment. To suit cases especially like performance-altering behaviors that are touched upon in issues like #4242 as well as https://github.com/oracle/python-cx_Oracle/issues/189, we need to open this up with a new event that intercepts the dialect-level setinputsizes call. |
From: Aurélien C. <iss...@bi...> - 2018-06-26 09:34:57
|
New issue 4289: automatic index name: hash collision https://bitbucket.org/zzzeek/sqlalchemy/issues/4289/automatic-index-name-hash-collision Aurélien Campéas: sqlalchemy 1.3.0b1, postgres 10, psycopg 2.7.4 ``` #!python from sqlalchemy import create_engine, MetaData, Table, Column, Integer, ForeignKey from sqlalchemy.dialects.postgresql import BYTEA, TIMESTAMP name = 'gas.lng.country.trinidad_and_tobago.net_imports.daily' ns = 'tsh-automatic.snapshot' meta = MetaData() table = Table( name, meta, Column('id', Integer, primary_key=True), Column('end', TIMESTAMP(timezone=True), index=True), Column('parent', Integer, ForeignKey('{}.{}.id'.format(ns, name)), index=True), schema=ns) engine = create_engine('postgresql://localhost/fail', echo=True) with engine.connect() as cn: cn.execute('drop schema if exists "{}" cascade'.format(ns)) cn.execute('create schema if not exists "{}"'.format(ns)) with engine.connect() as cn: table.create(cn) ``` => ``` #!shell 2018-06-26 10:48:04,996 INFO sqlalchemy.engine.base.Engine select version() 2018-06-26 10:48:04,996 INFO sqlalchemy.engine.base.Engine {} 2018-06-26 10:48:04,998 INFO sqlalchemy.engine.base.Engine select current_schema() 2018-06-26 10:48:04,998 INFO sqlalchemy.engine.base.Engine {} 2018-06-26 10:48:04,999 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1 2018-06-26 10:48:04,999 INFO sqlalchemy.engine.base.Engine {} 2018-06-26 10:48:04,999 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1 2018-06-26 10:48:04,999 INFO sqlalchemy.engine.base.Engine {} 2018-06-26 10:48:05,000 INFO sqlalchemy.engine.base.Engine show standard_conforming_strings 2018-06-26 10:48:05,000 INFO sqlalchemy.engine.base.Engine {} 2018-06-26 10:48:05,001 INFO sqlalchemy.engine.base.Engine drop schema if exists "tsh-automatic.snapshot" cascade 2018-06-26 10:48:05,001 INFO sqlalchemy.engine.base.Engine {} 2018-06-26 10:48:05,003 INFO sqlalchemy.engine.base.Engine COMMIT 2018-06-26 10:48:05,010 INFO sqlalchemy.engine.base.Engine create schema if not exists "tsh-automatic.snapshot" 2018-06-26 10:48:05,010 INFO sqlalchemy.engine.base.Engine {} 2018-06-26 10:48:05,012 INFO sqlalchemy.engine.base.Engine COMMIT 2018-06-26 10:48:05,014 INFO sqlalchemy.engine.base.Engine CREATE TABLE "tsh-automatic.snapshot"."gas.lng.country.trinidad_and_tobago.net_imports.daily" ( id SERIAL NOT NULL, "end" TIMESTAMP WITH TIME ZONE, parent INTEGER, PRIMARY KEY (id), FOREIGN KEY(parent) REFERENCES "tsh-automatic.snapshot"."gas.lng.country.trinidad_and_tobago.net_imports.daily" (id) ) 2018-06-26 10:48:05,014 INFO sqlalchemy.engine.base.Engine {} 2018-06-26 10:48:05,018 INFO sqlalchemy.engine.base.Engine COMMIT 2018-06-26 10:48:05,019 INFO sqlalchemy.engine.base.Engine CREATE INDEX "ix_tsh-automatic_snapshot_gas.lng.country.trinidad_and__e711" ON "tsh-automatic.snapshot"."gas.lng.country.trinidad_and_tobago.net_imports.daily" ("end") 2018-06-26 10:48:05,019 INFO sqlalchemy.engine.base.Engine {} 2018-06-26 10:48:05,022 INFO sqlalchemy.engine.base.Engine COMMIT 2018-06-26 10:48:05,024 INFO sqlalchemy.engine.base.Engine CREATE INDEX "ix_tsh-automatic_snapshot_gas.lng.country.trinidad_and__e711" ON "tsh-automatic.snapshot"."gas.lng.country.trinidad_and_tobago.net_imports.daily" (parent) 2018-06-26 10:48:05,024 INFO sqlalchemy.engine.base.Engine {} 2018-06-26 10:48:05,026 INFO sqlalchemy.engine.base.Engine ROLLBACK Traceback (most recent call last): File "/Users/vq5355/src/sqlalchemy/lib/sqlalchemy/engine/base.py", line 1193, in _execute_context context) File "/Users/vq5355/src/sqlalchemy/lib/sqlalchemy/engine/default.py", line 509, in do_execute cursor.execute(statement, parameters) psycopg2.ProgrammingError: relation "ix_tsh-automatic_snapshot_gas.lng.country.trinidad_and__e711" already exists The above exception was the direct cause of the following exception: Traceback (most recent call last): File "fail.py", line 24, in <module> table.create(cn) File "/Users/vq5355/src/sqlalchemy/lib/sqlalchemy/sql/schema.py", line 779, in create checkfirst=checkfirst) File "/Users/vq5355/src/sqlalchemy/lib/sqlalchemy/engine/base.py", line 1549, in _run_visitor **kwargs).traverse_single(element) File "/Users/vq5355/src/sqlalchemy/lib/sqlalchemy/sql/visitors.py", line 121, in traverse_single return meth(obj, **kw) File "/Users/vq5355/src/sqlalchemy/lib/sqlalchemy/sql/ddl.py", line 796, in visit_table self.traverse_single(index) File "/Users/vq5355/src/sqlalchemy/lib/sqlalchemy/sql/visitors.py", line 121, in traverse_single return meth(obj, **kw) File "/Users/vq5355/src/sqlalchemy/lib/sqlalchemy/sql/ddl.py", line 823, in visit_index self.connection.execute(CreateIndex(index)) File "/Users/vq5355/src/sqlalchemy/lib/sqlalchemy/engine/base.py", line 948, in execute return meth(self, multiparams, params) File "/Users/vq5355/src/sqlalchemy/lib/sqlalchemy/sql/ddl.py", line 68, in _execute_on_connection return connection._execute_ddl(self, multiparams, params) File "/Users/vq5355/src/sqlalchemy/lib/sqlalchemy/engine/base.py", line 1009, in _execute_ddl compiled File "/Users/vq5355/src/sqlalchemy/lib/sqlalchemy/engine/base.py", line 1200, in _execute_context context) File "/Users/vq5355/src/sqlalchemy/lib/sqlalchemy/engine/base.py", line 1413, in _handle_dbapi_exception exc_info File "/Users/vq5355/src/sqlalchemy/lib/sqlalchemy/util/compat.py", line 203, in raise_from_cause reraise(type(exception), exception, tb=exc_tb, cause=cause) File "/Users/vq5355/src/sqlalchemy/lib/sqlalchemy/util/compat.py", line 186, in reraise raise value.with_traceback(tb) File "/Users/vq5355/src/sqlalchemy/lib/sqlalchemy/engine/base.py", line 1193, in _execute_context context) File "/Users/vq5355/src/sqlalchemy/lib/sqlalchemy/engine/default.py", line 509, in do_execute cursor.execute(statement, parameters) sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) relation "ix_tsh-automatic_snapshot_gas.lng.country.trinidad_and__e711" already exists [SQL: 'CREATE INDEX "ix_tsh-automatic_snapshot_gas.lng.country.trinidad_and__e711" ON "tsh-automatic.snapshot"."gas.lng.country.trinidad_and_tobago.net_imports.daily" (parent)'] (Background on this error at: http://sqlalche.me/e/f405) ``` |
From: Sean D. <iss...@bi...> - 2018-06-25 16:49:55
|
New issue 4288: FK Reflection in MSSQL incorrectly identifies duplicate source columns for identically-named PKs in different schemas https://bitbucket.org/zzzeek/sqlalchemy/issues/4288/fk-reflection-in-mssql-incorrectly Sean Dunn: For MSSQL: - When reflecting a database (such as using `autoload` for a table) an exception can be thrown `ArgumentError: ForeignKeyConstraint with duplicate source column references are not supported.` Even when there are no duplicate source column references in the database. This is caused by two tables in two schemas with the same Primary Key names -- SqlAlchemy confuses these two Primary Keys as being the referred column for a Foreign Key, when only one of them is. This is because SqlAlchemy isn't also checking the constraint schema. To reproduce: - Create two schemas FOO and BAR - Create three tables, FOO.FOOTABLE, FOO.BAZTABLE, BAR.BARTABLE - Create a PRIMARY KEY on FOO.BAZTABLE and BAR.BARTABLE with the same PK names (i.e. `CONSTRAINT [MY_PK] PRIMARY KEY CLUSTERED ([MY_PK_COL]) - Create a FK in FOO.FOOTABLE that references FOO.BAZTABLE.MY_PK_COL - reflect `FOO.FOOTABLE` via `footable = Table('FOOTABLE', fooschemameta, autoload=True, autoload_with=myengine)` Here's one example of someone else who has had the same problem: https://stackoverflow.com/questions/47205433/sqlalchemy-table-reflection-remove-duplicate-source-column-references/51024467#51024467 The root issue is in `dialects/mssql/base.py` in `def_foreign_keys` -- the query that checks the foreign key constraints does not have a WHERE clause that matches the `R.c.constraint_schema` to `RR.c.unique_constraint_schema`. -- so it's not uniquely identifying the PK (PK's can have identical names in different schemas, so we also need to check the schema) |
From: Michael B. <iss...@bi...> - 2018-06-25 04:19:53
|
New issue 4287: baked cache key generation fails on relationship from subclass https://bitbucket.org/zzzeek/sqlalchemy/issues/4287/baked-cache-key-generation-fails-on Michael Bayer: ``` #!python from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declared_attr Base = declarative_base() class Parent(Base): __tablename__ = 'parent' id = Column(Integer, primary_key=True) class Child(Base): __tablename__ = 'child' id = Column(Integer, primary_key=True) parent_id = Column(Integer, ForeignKey('parent.id')) parent = relationship('Parent', backref=backref('children')) type = Column(String(), nullable=False) __mapper_args__ = { 'polymorphic_on': type, } class ChildSubclass1(Child): __tablename__ = 'child_subclass1' id = Column(Integer, ForeignKey('child.id'), primary_key=True) __mapper_args__ = { 'polymorphic_identity': 'subclass1', 'polymorphic_load': 'selectin' } class Other(Base): __tablename__ = 'other' id = Column(Integer, primary_key=True) child_subclass_id = Column(Integer, ForeignKey('child_subclass1.id')) child_subclass = relationship('ChildSubclass1', backref=backref('others')) configure_mappers() opt = joinedload( Parent.children.of_type(ChildSubclass1) ).joinedload(ChildSubclass1.others) path = Parent.__mapper__._path_registry[Parent.children.property][Child.__mapper__] print( opt._generate_cache_key(path) ) ``` generates: ``` #!python ((<class '__main__.ChildSubclass1'>, ('lazy', 'joined')),) ``` e.g. not taking "Other" into account. Load._chop_path() is failing. See also #4286 where this was found. |
From: Michael B. <iss...@bi...> - 2018-06-25 02:09:39
|
New issue 4286: mapper._subclass_load_via_in() returns mutable state https://bitbucket.org/zzzeek/sqlalchemy/issues/4286/mapper_subclass_load_via_in-returns Michael Bayer: demo: ``` #!python from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declared_attr Base = declarative_base() class Parent(Base): __tablename__ = 'parent' id = Column(Integer, primary_key=True) class Child(Base): __tablename__ = 'child' id = Column(Integer, primary_key=True) parent_id = Column(Integer, ForeignKey('parent.id')) parent = relationship('Parent', backref=backref('children')) type = Column(String(), nullable=False) __mapper_args__ = { 'polymorphic_on': type, } class ChildSubclass1(Child): __tablename__ = 'child_subclass1' id = Column(Integer, ForeignKey('child.id'), primary_key=True) __mapper_args__ = { 'polymorphic_identity': 'subclass1', 'polymorphic_load': 'selectin' } class Other(Base): __tablename__ = 'other' id = Column(Integer, primary_key=True) child_subclass_id = Column(Integer, ForeignKey('child_subclass1.id')) child_subclass = relationship('ChildSubclass1', backref=backref('others')) e = create_engine("sqlite://", echo=True) Base.metadata.create_all(e) def is_other_in_session(): return any(isinstance(model, Other) for model in session) session = Session(e, enable_baked_queries=False) parent = Parent() subclass1 = ChildSubclass1(parent=parent) other = Other(child_subclass=subclass1) session.add_all([parent, subclass1, other]) session.commit() # Test 1: Loading Parent + Children does not load Other print('\nTest #1: Loading Parent + Children does not load others') session.expunge_all() assert not is_other_in_session() parents = session.query(Parent).options( joinedload(Parent.children.of_type(ChildSubclass1))).all() assert not is_other_in_session() print('\nTest #2: Loading Parent + Children + Others loads others as expected') session.expunge_all() assert not is_other_in_session() parents = session.query(Parent).options( joinedload(Parent.children.of_type(ChildSubclass1)) .joinedload(ChildSubclass1.others) ).all() print('\nTest #3: Loading Parent + Children should not load others, ' 'but it does now') session.expunge_all() assert not is_other_in_session() parents = session.query(Parent).options( joinedload(Parent.children.of_type(ChildSubclass1)) ).all() assert not is_other_in_session(), 'The above query should not load any Others!' ``` the options being returned are fixed at _subclass_load_via_in and the options seem to be getting modified in place, test passes as: ``` #!diff diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index a30a8c243..17677cb3f 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -2814,7 +2814,8 @@ class Mapper(InspectionAttr): return q, enable_opt, disable_opt - @_memoized_configured_property + #@_memoized_configured_property + @property def _subclass_load_via_in_mapper(self): return self._subclass_load_via_in(self) ``` |
From: moon c. <iss...@bi...> - 2018-06-24 00:31:04
|
New issue 4285: session attempted to sort enum.Enum https://bitbucket.org/zzzeek/sqlalchemy/issues/4285/session-attempted-to-sort-enumenum moon cake: It seems like `_sort_states` in `persistence.py` is trying to sort the primary key(s), irregardless whether it is sortable. In this case, I'm using an `enum.Enum`. Full repro code follows. ``` (sqlalchemy) $ python test.py Traceback (most recent call last): File "test.py", line 35, in <module> create_trees(session) File "test.py", line 29, in create_trees session.query(Tree).merge_result([Tree(color=Color.red), Tree(color=Color.black)]) File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 572, in __exit__ self.rollback() File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 66, in __exit__ compat.reraise(exc_type, exc_value, exc_tb) File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 187, in reraise raise value File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 569, in __exit__ self.commit() File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 467, in commit self._prepare_impl() File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 447, in _prepare_impl self.session.flush() File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 2254, in flush self._flush(objects) File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 2380, in _flush transaction.rollback(_capture_exception=True) File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 66, in __exit__ compat.reraise(exc_type, exc_value, exc_tb) File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 187, in reraise raise value File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 2344, in _flush flush_context.execute() File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", line 391, in execute rec.execute(self) File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", line 556, in execute uow File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py", line 156, in save_obj base_mapper, states, uowtransaction File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py", line 286, in _organize_states_for_save states): File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py", line 1255, in _connections_for_states for state in _sort_states(states): File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py", line 1277, in _sort_states sorted(persistent, key=lambda q: q.key[1]) TypeError: '<' not supported between instances of 'Color' and 'Color' ``` ======= Repro code ```py import enum from sqlalchemy import create_engine, Column, Enum from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base class Color(enum.Enum): red = 'Red' black = 'Black' Base = declarative_base() class Tree(Base): __tablename__ = 'tree' color = Column(Enum(Color), primary_key=True) engine = create_engine('postgresql://tree:tree@127.0.0.1/trees') Base.metadata.create_all(engine) Session = sessionmaker(bind=engine) def create_trees(session): with session.begin_nested(): session.query(Tree).merge_result([Tree(color=Color.red), Tree(color=Color.black)]) session.commit() session = Session() create_trees(session) create_trees(session) ``` |
From: John B. <iss...@bi...> - 2018-06-22 23:07:12
|
New issue 4284: SQLite only dialect to enforce an offset with a limit clause https://bitbucket.org/zzzeek/sqlalchemy/issues/4284/sqlite-only-dialect-to-enforce-an-offset John Bodley: It seems that some dialects which support a limit offset (like [MySQL](https://bitbucket.org/zzzeek/sqlalchemy/src/c352257070e17baada280befd2beae15ee26f4d0/lib/sqlalchemy/dialects/mysql/base.py?at=master&fileviewer=file-view-default#base.py-1101)) only define it when the provided offset is non-None, however in the case of SQLite the generated SQL always includes an offset (default of zero) if a limit clause is present per [here](https://bitbucket.org/zzzeek/sqlalchemy/src/c352257070e17baada280befd2beae15ee26f4d0/lib/sqlalchemy/dialects/sqlite/base.py?at=master&fileviewer=file-view-default#base.py-843). I was wondering why this was especially as in SQLite an offset is deemed optional. |
From: colafly <iss...@bi...> - 2018-06-21 13:18:10
|
New issue 4283: UTF8MB4 issue with MySQL 8 and PyMySQL https://bitbucket.org/zzzeek/sqlalchemy/issues/4283/utf8mb4-issue-with-mysql-8-and-pymysql colafly: Using MySQL 8 and PyMySQL 0.8.1 with SQLAlchemy 1.2.8. ``` e = create_engine('mysql+pymysql://account@localhost:3306/db?charset=utf8mb4') e.connect() ~/lib/python3.6/site-packages/pymysql/cursors.py:170: Warning: (3719, "'utf8' is currently an alias for the character set UTF8MB3, which will be replaced by UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.") result = self._query(query) ``` This doesn't happen with MySQL 5. I'm already using utf8mb4, so I shouldn't really see this. Thanks! |
From: Umberto P. <iss...@bi...> - 2018-06-20 11:07:52
|
New issue 4282: Datepart wrong first parameter on MSSQL engine (Re-raised) https://bitbucket.org/zzzeek/sqlalchemy/issues/4282/datepart-wrong-first-parameter-on-mssql Umberto Prim: Stumbled upon the same error as in issue [3624](https://bitbucket.org/zzzeek/sqlalchemy/issues/3624) ``` #!python ProgrammingError: (pyodbc.ProgrammingError) ('42000', '[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid parameter 1 specified for datepart ``` using: ``` #!python func.datepart('ISO_WEEK', table_obj.c.Column) ``` With `mssql` with `pyodbc` and `sqlalchemy` version `1.2.8` While with textual construct: ``` #!python text('datepart(ISO_WEEK, tbl_name.Column)') ``` it works as expected. |
From: JD <iss...@bi...> - 2018-06-19 23:06:55
|
New issue 4281: creating Base Class Issue https://bitbucket.org/zzzeek/sqlalchemy/issues/4281/creating-base-class-issue JD: I am getting following error, when i try to create Base Class. Target table is from MEMSQL. E:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\dialects\mysql\reflection.py:57: SAWarning: Unknown schema content: ' KEY `id` (`id`) /*!90619 USING CLUSTERED COLUMNSTORE */' util.warn("Unknown schema content: %r" % line) E:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\dialects\mysql\reflection.py:57: SAWarning: Unknown schema content: ' /*!90618 , SHARD KEY () */ ' util.warn("Unknown schema content: %r" % line) Traceback (most recent call last): File "<ipython-input-98-fd6724ddc1df>", line 72, in <module> TempClass = Base.classes.probe_sample_event File "E:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\util\_collections.py", line 212, in __getattr__ raise AttributeError(key) AttributeError: probe_sample_event |
From: VA <iss...@bi...> - 2018-06-18 21:47:08
|
New issue 4280: constant enum values fails with mysql driver https://bitbucket.org/zzzeek/sqlalchemy/issues/4280/constant-enum-values-fails-with-mysql VA: I have a table with an Integer column. When filtering on this column using a Python int value, I only get rows matching the integer, which is expected. However, if I filter on the same column with an IntEnum value, I do not get any rows at all when using the mysql driver. It works properly using the sqlite driver though. Attached is a sample source file creating a basic table and doing basic filters. Switching between the 2 drivers is a matter of commenting one line, yet the behavior is completely different. Here are excerpts from the attached file: * A working line with both drivers: ``` #!python print(session.query(Simple).filter(Simple.stuff == 1).all()) ``` * Line not working with mysql: ``` #!python print(session.query(Simple).filter(Simple.stuff == My.a).all()) ``` When using mysql, I get this warning: ``` #!python /usr/lib/python2.7/dist-packages/sqlalchemy/engine/default.py:508: Warning: (1292L, "Truncated incorrect DOUBLE value: 'My.a'") ``` So it seems the mysql driver is attempting stringification of a value which is an int (IntEnum inherits int) and fails. |
From: Michael B. <iss...@bi...> - 2018-06-15 02:37:47
|
New issue 4279: table.tometadata() fails on index that was created on interim version of table https://bitbucket.org/zzzeek/sqlalchemy/issues/4279/tabletometadata-fails-on-index-that-was Michael Bayer: This seems to be a regression in 1.2 due to #4147 ``` #!python from sqlalchemy import * m1 = MetaData() t1 = Table( 'test', m1, Column('id', Integer, primary_key=True), Column('eventtime', DateTime), ) Index("ix_test", t1.c.eventtime) t1 = Table( 'test', m1, Column('id', Integer, primary_key=True), Column('eventtime', DateTime), extend_existing=True ) m2 = MetaData() t2 = t1.tometadata(m2) ``` |
From: jan.budinsky <iss...@bi...> - 2018-06-14 14:50:30
|
New issue 4278: NULL does not override default value if new instance is created when session.merge(row) https://bitbucket.org/zzzeek/sqlalchemy/issues/4278/null-does-not-override-default-value-if jan.budinsky: Default column value is not overridden by `NULL` in `Declarative API` as it should be. If a column has a non-null default value that is overridden by another non-null value, everything works as expected - the specified value is always inserted as the value of the column instead of the default one. This however does not seem to be the case when overriding non-null default value with `NULL`. If a matching row (via primary key) has been already created (`merge` does `UPDATE`), the column will have `NULL` filled as its value, as expected. But if a matching row hasn't been created yet (`merge` does `INSERT INTO`), the column will have default value instead of expected `NULL`. The issue is the same using both `postgresql` and `in-memory sqlite`. Please see the script below reproducing the issue, thank you. ``` #!python from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, scoped_session from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column from sqlalchemy.dialects.postgresql import BIGINT, VARCHAR CONN_STR = "sqlite:///:memory:" Base = declarative_base() class Table(Base): __tablename__ = "table" id = Column(BIGINT, primary_key=True) field = Column(VARCHAR, default="placeholder") def merge(session, row): session.begin() try: session.merge(row) session.commit() except: session.rollback() raise def select(session, table, **criteria): return session.query(table).filter_by(**criteria).all() def delete(session, table, **criteria): return session.query(table).filter_by(**criteria).delete() def main(): engine = create_engine(CONN_STR, echo=False) Base.metadata.create_all(engine) # create table session = scoped_session(sessionmaker(bind=engine, autocommit=True))() data_null = { "id": 1, "field": None } data_value = { "id": 2, "field": "value" } # cleanup delete(session=session, table=Table, id=data_null["id"]) delete(session=session, table=Table, id=data_value["id"]) merge(session=session, row=Table(**data_null)) print(select(session=session, table=Table, id=data_null["id"])[0].field) # "placeholder" ??? merge(session=session, row=Table(**data_null)) print(select(session=session, table=Table, id=data_null["id"])[0].field) # None merge(session=session, row=Table(**data_value)) print(select(session=session, table=Table, id=data_value["id"])[0].field) # "value" merge(session=session, row=Table(**data_value)) print(select(session=session, table=Table, id=data_value["id"])[0].field) # "value" if __name__ == "__main__": main() ``` Environment: ``` python version - 3.6.3 SQLAlchemy version - 1.2.8 ``` |
From: Michael B. <iss...@bi...> - 2018-06-13 19:24:33
|
New issue 4277: mysql dialects client_flags work inconsistently per calling style https://bitbucket.org/zzzeek/sqlalchemy/issues/4277/mysql-dialects-client_flags-work Michael Bayer: because the dialects apply the FOUND_ROWS inside the create_connect_args method, if client_flags are passed in connect_args, the FOUND_ROWS flag is not applied: ``` #!python from sqlalchemy import create_engine from MySQLdb.constants import CLIENT from unittest import mock from MySQLdb import connect m1 = mock.Mock() def patch_mysql_connect(*arg, **kw): m1(*arg, **kw) return connect(*arg, **kw) with mock.patch("MySQLdb.connect", patch_mysql_connect): e1 = create_engine( "mysql+mysqldb://scott:tiger@localhost/test?client_flag=%s" % CLIENT.MULTI_STATEMENTS, ) e2 = create_engine( "mysql+mysqldb://scott:tiger@localhost/test", connect_args={"client_flag": CLIENT.MULTI_STATEMENTS} ) c1 = e1.connect() c2 = e2.connect() print(m1.mock_calls) assert m1.mock_calls[0] == m1.mock_calls[1] ``` output ``` #!python [call(client_flag=65538, db='test', host='localhost', passwd='tiger', user='scott'), call(client_flag=65536, db='test', host='localhost', passwd='tiger', user='scott')] Traceback (most recent call last): File "test.py", line 27, in <module> assert m1.mock_calls[0] == m1.mock_calls[1] AssertionError ``` we either need to change the API of create_connect_args to also accept the client arguments, which would break many third party dialects, pass them onto the URL, or add a new method so that the dialect gets access to the connect args. |