Thank you, now there are no errors and SQLAlchemy works fine but probably alembic do it wrong.
When I created first migration it doesn't detect qouted (case sensitive) tables like "doctor" (https://gist.github.com/uralbash/e83fef54003cef3111d9d4cd18145708#file-alembic-bash) and not quoted tables added twice in migration file (https://gist.github.com/uralbash/e83fef54003cef3111d9d4cd18145708#file-2bcdb50b589a_create_doctors_patients_appointments-py) INFO [alembic.autogenerate.compare] Detected added table 'PATIENTS' INFO [alembic.autogenerate.compare] Detected removed table 'patients' I tested it a few times and create everything from scratch (https://gist.github.com/uralbash/e83fef54003cef3111d9d4cd18145708#file-db_create-sql) but always I get this wrong result среда, 16 ноября 2016 г., 19:30:34 UTC+5 пользователь Mike Bayer написал: > > still trying to get fdb to work but looking at the source it seems like > https://bitbucket.org/zzzeek/sqlalchemy/issues/3548 needs to be ported > to firebird, as the steps taken for Oracle weren't replicated. should > be easy if this is the case. > > > > On 11/16/2016 01:31 AM, uralbash wrote: > > Thank you, I have prepared a simple example with three tables > > https://gist.github.com/uralbash/a623e621093a6a10fd2ea85b5a1ee124 > > > > To avoid install FireBird in my system I use Docker + Vagrant > > > https://github.com/uralbash/docker-template/blob/master/vagrant/databases/firebird/Vagrantfile > > > and GUI client FlameRobin > > > > понедельник, 14 ноября 2016 г., 20:19:52 UTC+5 пользователь Mike Bayer > > написал: > > > > > > > > On 11/14/2016 01:43 AM, uralbash wrote: > > > I use quoted_name to describe the table schema (declarative > > method) in > > > my project like this: > > > > > > | > > > classPeople(Base): > > > """ > > > .. restapi:: > > > :table: people > > > """ > > > __tablename__ =quoted_name('people',quote=True) > > > > > > id =Column( > > > quoted_name("id",quote=True), > > > Integer,Sequence('GEN_people_ID'), > > > primary_key=True,autoincrement=True > > > ) > > > name =Column( > > > quoted_name("name",quote=True), > > > Unicode > > > ) > > > | > > > > > > And it's work ok for me. > > > Now I want to make migration for other FireBird database with auto > > > reflect table, because it designed outside of python and > SQLAlchemy. > > > I redid env.py as you suggested. At first I get all tablenames by > raw > > > query and then autoload table and put it to metadata. > > > > > > | > > > # future > > > from__future__ importwith_statement > > > > > > # standard library > > > fromlogging.config importfileConfig > > > > > > # SQLAlchemy > > > importsqlalchemy > > > fromsqlalchemy importTable,MetaData,pool,engine_from_config > > > fromsqlalchemy.ext.automap importautomap_base > > > fromsqlalchemy.sql.elements importquoted_name > > > fromsqlalchemy.ext.declarative importdeclarative_base > > > > > > # third-party > > > fromalembic importcontext > > > fromalembic.ddl.impl importDefaultImpl > > > > > > > > > classFirebirdImpl(DefaultImpl): > > > __dialect__ ='firebird' > > > transactional_ddl =True > > > > > > > > > # this is the Alembic Config object, which provides > > > # access to the values within the .ini file in use. > > > config =context.config > > > > > > metadata =MetaData() > > > > > > engine =engine_from_config( > > > config.get_section(config.config_ini_section), > > > prefix='sqlalchemy.', > > > poolclass=pool.NullPool) > > > > > > q =engine.execute(''' > > > select rdb$relation_name > > > from rdb$relations > > > where rdb$view_blr is null > > > and (rdb$system_flag is null or rdb$system_flag = 0) > > > ''') > > > tables =[x[0].strip()forx inq.fetchall()] > > > > > > create_done =0 > > > > > > while(notcreate_done): > > > create_done =1 > > > fortable intables: > > > print(table) > > > iftable.isupper(): > > > try: > > > Table(table,metadata,autoload_with=engine) > > > exceptsqlalchemy.exc.NoSuchTableErrorase: > > > create_done =0 > > > continue > > > try: > > > _table =Table(quoted_name(table,True),metadata, > > > autoload_with=engine) > > > exceptsqlalchemy.exc.NoSuchTableErrorase: > > > create_done =0 > > > > > > print(metadata.tables) > > > print(metadata.tables.keys()) > > > > > > the stack trace indicates it's failing when it iterates through the > > list > > of foreign key constraints for a table, finds one that refers to a > > table > > called "readers", and then the case sensitivity isn't working out > such > > that it can't actually locate a table of that name. > > > > if you can isolate this single pair of tables, then do a simple test > > script that's like : > > > > > > Table(<tablename>, metadata, autoload_with=engine) > > > > where <tablename> is the table that has a foreign key reference to > > "readers". > > > > then if you could show me the CREATE TABLE statements for those two > > tables verbatim, if I can get a firebird running somewhere I can try > to > > find time to run this and look into it. > > > > > > > > > > # Interpret the config file for Python logging. > > > # This line sets up loggers basically. > > > fileConfig(config.config_file_name) > > > > > > # add your model's MetaData object here > > > # for 'autogenerate' support > > > # from myapp import mymodel > > > # target_metadata = mymodel.Base.metadata > > > target_metadata =metadata > > > > > > # other values from the config, defined by the needs of env.py, > > > # can be acquired: > > > # my_important_option = > config.get_main_option("my_important_option") > > > # ... etc. > > > > > > > > > defrun_migrations_offline(): > > > """Run migrations in 'offline' mode. > > > > > > This configures the context with just a URL > > > and not an Engine, though an Engine is acceptable > > > here as well. By skipping the Engine creation > > > we don't even need a DBAPI to be available. > > > > > > Calls to context.execute() here emit the given string to the > > > script output. > > > > > > """ > > > url =config.get_main_option("sqlalchemy.url") > > > context.configure( > > > url=url, > > > target_metadata=target_metadata, > > > literal_binds=True > > > ) > > > > > > withcontext.begin_transaction(): > > > context.run_migrations() > > > > > > > > > defrun_migrations_online(): > > > """Run migrations in 'online' mode. > > > > > > In this scenario we need to create an Engine > > > and associate a connection with the context. > > > > > > """ > > > > > > withengine.connect()asconnection: > > > context.configure( > > > connection=connection, > > > target_metadata=target_metadata > > > ) > > > > > > withcontext.begin_transaction(): > > > context.run_migrations() > > > > > > > > > ifcontext.is_offline_mode(): > > > run_migrations_offline() > > > else: > > > run_migrations_online() > > > > > > | > > > > > > It seems now the tables are created properly but alembic still > raise > > > exception bytable names > > > > > > > > > | > > > INFO [alembic.runtime.migration]Contextimpl FirebirdImpl. > > > INFO [alembic.runtime.migration]Willassume transactional DDL. > > > INFO [alembic.autogenerate.compare]Detectedadded table > 'COMPANIES' > > > INFO [alembic.autogenerate.compare]Detectedadded table 'CARD' > > > INFO [alembic.autogenerate.compare]Detectedadded table > 'LOCATIONS' > > > INFO [alembic.autogenerate.compare]Detectedadded table 'RADIO' > > > Traceback(most recent call last): > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/bin/alembic",line > > > > > 9,in<module> > > > > load_entry_point('alembic==0.8.8','console_scripts','alembic')() > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/alembic/config.py",line > > > > > > > 479,inmain > > > CommandLine(prog=prog).main(argv=argv) > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/alembic/config.py",line > > > > > > > 473,inmain > > > self.run_cmd(cfg,options) > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/alembic/config.py",line > > > > > > > 456,inrun_cmd > > > **dict((k,getattr(options,k))fork inkwarg) > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/alembic/command.py",line > > > > > > > 117,inrevision > > > script_directory.run_env() > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/alembic/script/base.py",line > > > > > > > 407,inrun_env > > > util.load_python_file(self.dir,'env.py') > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/alembic/util/pyfiles.py",line > > > > > > > 93,inload_python_file > > > module=load_module_py(module_id,path) > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/alembic/util/compat.py",line > > > > > > > 68,inload_module_py > > > module_id,path).load_module(module_id) > > > File"<frozen importlib._bootstrap_external>",line > > > 388,in_check_name_wrapper > > > File"<frozen importlib._bootstrap_external>",line > 809,inload_module > > > File"<frozen importlib._bootstrap_external>",line > 668,inload_module > > > File"<frozen importlib._bootstrap>",line 268,in_load_module_shim > > > File"<frozen importlib._bootstrap>",line 693,in_load > > > File"<frozen importlib._bootstrap>",line 673,in_load_unlocked > > > File"<frozen importlib._bootstrap_external>",line > 665,inexec_module > > > File"<frozen importlib._bootstrap>",line > > 222,in_call_with_frames_removed > > > File"spgt/env.py",line 123,in<module> > > > run_migrations_online() > > > File"spgt/env.py",line 117,inrun_migrations_online > > > context.run_migrations() > > > File"<string>",line 8,inrun_migrations > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/alembic/runtime/environment.py",line > > > > > > > 797,inrun_migrations > > > self.get_context().run_migrations(**kw) > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/alembic/runtime/migration.py",line > > > > > > > 303,inrun_migrations > > > forstep inself._migrations_fn(heads,self): > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/alembic/command.py",line > > > > > > > 97,inretrieve_migrations > > > revision_context.run_autogenerate(rev,context) > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/alembic/autogenerate/api.py",line > > > > > > > 369,inrun_autogenerate > > > self._run_environment(rev,migration_context,True) > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/alembic/autogenerate/api.py",line > > > > > > > 405,in_run_environment > > > autogen_context,migration_script) > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/alembic/autogenerate/compare.py",line > > > > > > > 22,in_populate_migration_script > > > _produce_net_changes(autogen_context,upgrade_ops) > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/alembic/autogenerate/compare.py",line > > > > > > > 48,in_produce_net_changes > > > autogen_context,upgrade_ops,schemas > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/alembic/util/langhelpers.py",line > > > > > > > 314,ingo > > > fn(*arg,**kw) > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/alembic/autogenerate/compare.py",line > > > > > > > 77,in_autogen_for_tables > > > inspector,metadata,upgrade_ops,autogen_context) > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/alembic/autogenerate/compare.py",line > > > > > > > 138,in_compare_tables > > > inspector.reflecttable(t,None) > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/sqlalchemy/engine/reflection.py",line > > > > > > > 605,inreflecttable > > > exclude_columns,reflection_options) > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/sqlalchemy/engine/reflection.py",line > > > > > > > 727,in_reflect_fk > > > **reflection_options > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/sqlalchemy/sql/schema.py",line > > > > > > > 436,in__new__ > > > metadata._remove_table(name,schema) > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/sqlalchemy/util/langhelpers.py",line > > > > > > > 60,in__exit__ > > > compat.reraise(exc_type,exc_value,exc_tb) > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/sqlalchemy/util/compat.py",line > > > > > > > 186,inreraise > > > raisevalue > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/sqlalchemy/sql/schema.py",line > > > > > > > 431,in__new__ > > > table._init(name,metadata,*args,**kw) > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/sqlalchemy/sql/schema.py",line > > > > > > > 507,in_init > > > self._autoload(metadata,autoload_with,include_columns) > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/sqlalchemy/sql/schema.py",line > > > > > > > 519,in_autoload > > > self,include_columns,exclude_columns > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/sqlalchemy/engine/base.py",line > > > > > > > 1528,inrun_callable > > > returncallable_(self,*args,**kwargs) > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/sqlalchemy/engine/default.py",line > > > > > > > 364,inreflecttable > > > returninsp.reflecttable(table,include_columns,exclude_columns) > > > > > > > > > File"/home/uralbash/Projects/_tmp/_NotAliens/.sacrud_env/lib/python3.5/site-packages/sqlalchemy/engine/reflection.py",line > > > > > > > 598,inreflecttable > > > raiseexc.NoSuchTableError(table.name <http://table.name>) > > > sqlalchemy.exc.NoSuchTableError:readers > > > | > > > > > > > > > > > > > > > > > > пятница, 11 ноября 2016 г., 19:48:49 UTC+5 пользователь Mike Bayer > > написал: > > > > > > SQLAlchemy has a case sensitivity behavior that assumes an all > > > lowercase > > > name to indicate "case insensitive". Firebird and Oracle both > > use > > > ALL_UPPERCASE to indicate "case insensitive". SQLAlchemy > > converts > > > between these two. > > > > > > Therefore if your table shows up in Firebird as SOME_TABLE, > > assuming it > > > is not a *quoted* name, call upon it in SQLAlchemy as: > > > > > > # if name is *not* quoted > > > t = Table("some_table", m, autoload_with=engine) > > > > > > if the name is truly the case-sensitive, quoted "SOME_TABLE", > > then you > > > can manually pass this in as: > > > > > > # if name *is* quoted > > > from sqlalchemy.sql.elements import quoted_name > > > t = Table(quoted_name("SOME_TABLE", True), m, > > autoload_with=engine) > > > > > > quoted_name is at > > > > > > http://docs.sqlalchemy.org/en/latest/core/sqlelement.html?highlight=quoted#sqlalchemy.sql.elements.quoted_name > > > < > http://docs.sqlalchemy.org/en/latest/core/sqlelement.html?highlight=quoted#sqlalchemy.sql.elements.quoted_name> > > > > > > > > > < > http://docs.sqlalchemy.org/en/latest/core/sqlelement.html?highlight=quoted#sqlalchemy.sql.elements.quoted_name > > > < > http://docs.sqlalchemy.org/en/latest/core/sqlelement.html?highlight=quoted#sqlalchemy.sql.elements.quoted_name>> > > > > > > > > > > > > > -- > > > 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 > > <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 sqlalchemy+...@googlegroups.com <javascript:> > > > <mailto:sqlalchemy+unsubscr...@googlegroups.com <javascript:> > <javascript:>>. > > > To post to this group, send email to sqlal...@googlegroups.com > > <javascript:> > > > <mailto:sqlal...@googlegroups.com <javascript:>>. > > > Visit this group at https://groups.google.com/group/sqlalchemy > > <https://groups.google.com/group/sqlalchemy>. > > > For more options, visit https://groups.google.com/d/optout > > <https://groups.google.com/d/optout>. > > > > -- > > 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 sqlalchemy+...@googlegroups.com <javascript:> > > <mailto:sqlalchemy+unsubscr...@googlegroups.com <javascript:>>. > > To post to this group, send email to sqlal...@googlegroups.com > <javascript:> > > <mailto:sqlal...@googlegroups.com <javascript:>>. > > Visit this group at https://groups.google.com/group/sqlalchemy. > > For more options, visit https://groups.google.com/d/optout. > -- 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 sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.