Took me a little while to figure out what was going on, but it seems the
code breaks when you try to use a primary key column that uses a sequence
in sqlite,
e.g. if my schema is this:
create table if not exists generic_sequence (
id integer primary key *autoincrement*,
visible_id integer,
alias text not null,
content text not null,
annotation_json clob not null,
checksum text not null
);
if I tell the constructor of "Model" to print the column and column type
for each column in the table (line 83 in codegen.py), you can see what
happens in the output/stacktrace below
class Model(object):
def __init__(self, table):
super(Model, self).__init__()
self.table = table
self.schema = table.schema
print(table)
# Adapt column types to the most reasonable generic types (ie. VARCHAR ->
String)
for column in table.columns:
print(column)
print(column.type)
column.type = self._get_adapted_type(column.type, column.table.bind)
sqlacodegen sqlite:///sqlite.db
generic_sequence.id
INTEGER
generic_sequence.visible_id
INTEGER
generic_sequence.alias
TEXT
generic_sequence.content
TEXT
generic_sequence.annotation_json
TEXT
generic_sequence.checksum
TEXT
*sqlite_sequencesqlite_sequence.name*
Traceback (most recent call last):
File "/Users/aquinmx3/venv/gbrs-seq-anno3.7/bin/sqlacodegen", line 11, in
<module>
sys.exit(main())
File
"/Users/aquinmx3/venv/gbrs-seq-anno3.7/lib/python3.7/site-packages/sqlacodegen/main.py",
line 51, in main
args.noinflect, args.noclasses)
File
"/Users/aquinmx3/venv/gbrs-seq-anno3.7/lib/python3.7/site-packages/sqlacodegen/codegen.py",
line 418, in __init__
model = self.table_model(table)
File
"/Users/aquinmx3/venv/gbrs-seq-anno3.7/lib/python3.7/site-packages/sqlacodegen/codegen.py",
line 93, in __init__
print(column.type)
File
"/Users/aquinmx3/venv/gbrs-seq-anno3.7/lib/python3.7/site-packages/sqlalchemy/sql/type_api.py",
line 589, in __str__
return str(self.compile())
File
"/Users/aquinmx3/venv/gbrs-seq-anno3.7/lib/python3.7/site-packages/sqlalchemy/sql/type_api.py",
line 573, in compile
return dialect.type_compiler.process(self)
File
"/Users/aquinmx3/venv/gbrs-seq-anno3.7/lib/python3.7/site-packages/sqlalchemy/sql/compiler.py",
line 293, in process
return type_._compiler_dispatch(self, **kw)
File
"/Users/aquinmx3/venv/gbrs-seq-anno3.7/lib/python3.7/site-packages/sqlalchemy/sql/visitors.py",
line 81, in _compiler_dispatch
return meth(self, **kw)
File
"/Users/aquinmx3/venv/gbrs-seq-anno3.7/lib/python3.7/site-packages/sqlalchemy/sql/compiler.py",
line 2969, in visit_null
"type on this Column?" % type_)
sqlalchemy.exc.CompileError: Can't generate DDL for NullType(); did you
forget to specify a type on this Column?
So it looks like a sqlite_sequence object gets implicitly added to the
table (when you use autoincrement with primary key in sqlite dialect) and
it is passed to the Model but the code doesn't know how to handle it / what
it is.
I assume since the model doesn't need to know about the sequence in sqlite
(the database will handle the pk generation it doesn't affect the models in
any way), that just checking for if column == sqlite_sequence then pass
would fix this but that's just a guess
--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper
http://www.sqlalchemy.org/
To post example code, please provide an MCVE: Minimal, Complete, and Verifiable
Example. See http://stackoverflow.com/help/mcve for a full description.
---
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.