2010-06-08 4 views
1

Je suis une connexion au serveur mssql via pyodbc, via le pilote FreeTDS odbc, sur Linux Ubuntu 10.04. Sqlalchemy 0.5 utilise DATETIME pour les champs sqlalchemy.Date().Type de date sqlalchemy dans la migration 0,6 en utilisant mssql

Maintenant Sqlalchemy 0.6 utilise DATE, mais le serveur SQL 2000 n'a pas de type DATE. Comment puis-je faire DATETIME par défaut pour sqlalchemy.Date() sur sqlalchemy 0.6 mssql+pyodbc dialect? Je voudrais le garder aussi propre que possible.

Code est ici pour reproduire le problème:

import sqlalchemy 
from sqlalchemy import Table, Column, MetaData, Date, Integer, create_engine 

engine = create_engine(
    'mssql+pyodbc://sa:[email protected]/mydb?driver=FreeTDS') 

m = MetaData(bind=engine) 

tb = sqlalchemy.Table('test_date', m, 
    Column('id', Integer, primary_key=True), 
    Column('dt', Date()) 
) 
tb.create() 

Et voici le retraçage je reçois:

Traceback (most recent call last): 
    File "/tmp/teste.py", line 15, in <module> 
    tb.create() 
    File "/home/nosklo/.local/lib/python2.6/site-packages/sqlalchemy/schema.py", line 428, in create 
    bind.create(self, checkfirst=checkfirst) 
    File "/home/nosklo/.local/lib/python2.6/site-packages/sqlalchemy/engine/base.py", line 1647, in create 
    connection=connection, **kwargs) 
    File "/home/nosklo/.local/lib/python2.6/site-packages/sqlalchemy/engine/base.py", line 1682, in _run_visitor 
    **kwargs).traverse_single(element) 
    File "/home/nosklo/.local/lib/python2.6/site-packages/sqlalchemy/sql/visitors.py", line 77, in traverse_single 
    return meth(obj, **kw) 
    File "/home/nosklo/.local/lib/python2.6/site-packages/sqlalchemy/engine/ddl.py", line 58, in visit_table 
    self.connection.execute(schema.CreateTable(table)) 
    File "/home/nosklo/.local/lib/python2.6/site-packages/sqlalchemy/engine/base.py", line 1157, in execute 
    params) 
    File "/home/nosklo/.local/lib/python2.6/site-packages/sqlalchemy/engine/base.py", line 1210, in _execute_ddl 
    return self.__execute_context(context) 
    File "/home/nosklo/.local/lib/python2.6/site-packages/sqlalchemy/engine/base.py", line 1268, in __execute_context 
    context.parameters[0], context=context) 
    File "/home/nosklo/.local/lib/python2.6/site-packages/sqlalchemy/engine/base.py", line 1367, in _cursor_execute 
    context) 
    File "/home/nosklo/.local/lib/python2.6/site-packages/sqlalchemy/engine/base.py", line 1360, in _cursor_execute 
    context) 
    File "/home/nosklo/.local/lib/python2.6/site-packages/sqlalchemy/engine/default.py", line 277, in do_execute 
    cursor.execute(statement, parameters) 
sqlalchemy.exc.ProgrammingError: (ProgrammingError) 
('42000', '[42000] [FreeTDS][SQL Server]Column or parameter #2: 
Cannot find data type DATE. (2715) 
(SQLExecDirectW)') 
'\nCREATE TABLE test_date (\n\tid INTEGER NOT NULL IDENTITY(1,1), 
\n\tdt DATE NULL, \n\tPRIMARY KEY (id)\n)\n\n'() 

Répondre

0

Je l'ai eu - ma configuration était erronée.

Il s'avère que vous devez configurer freetds pour qu'il utilise la version 7.0 ou 8.0 du protocole TDS. Par défaut, il utilise 4.2, ce qui donne des résultats bizarres lors de l'interrogation de la version MS SQL Server, conduisant SQLAlchemy à un comportement confus, comme je l'ai décrit dans ma question. Je l'avais correctement défini sur le fichier freetds.conf, mais ce fichier n'était pas en cours de lecture, car il est analysé uniquement lorsque vous utilisez un DSN défini dans le fichier et que j'utilisais une chaîne de connexion comme dans l'exemple du fichier. question.

La définition de la variable TDSVER comme décrit here a résolu le problème.

0

Cette situation est censée être correctement traitée par sqlalchemy. Voir MS SQL - Date/Time Handling.

Vous pouvez également ce l'extrait de la mise en œuvre qui gère ce (voir mssql\base.py):

def visit_date(self, type_): 
    if self.dialect.server_version_info < MS_2008_VERSION: 
     return self.visit_DATETIME(type_) 
    else: 
     return self.visit_DATE(type_) 

Ma suggestion est de déboguer votre code et vérifier si ce MSTypeCompiler est utilisé et si vous appuyez sur la méthode visit_date(...).

0

Comment faites-vous les migrations !!?

Je suis dans le même bateau en utilisant mssqlsucks. Voici ma solution.

config

SQLALCHEMY_DATABASE_URI = 'mssql+pyodbc://dashboarddata' 
SQLALCHEMY_MIGRATE_REPO = os.path.join(basedir, 'db_repository') 

mon .py initialisation (où est le soulignement?)

j'avais tant de problèmes d'encodage, je fini par le faire, et il semble fonctionner. J'aimerais voir ce que vous avez finalement fini par faire.

class HackedSQLAlchemy(SQLAlchemy): 
    def apply_driver_hacks(self, app, info, options): 
     print "Applying driver hacks" 
     super(HackedSQLAlchemy, self).apply_driver_hacks(app, info, options) 
     options["supports_unicode_binds"] = False 
     # import pdb 
     # pdb.set_trace() 
@app.template_filter('reverse') 
def reverse_filter(s): 
    if s > datetime.date.today(): 
     return 0 
    else: 
     return 1 

db = HackedSQLAlchemy(app) 
Questions connexes