0

Linux ubuntu 10.04で、pyodbc、FreeTDS odbcドライバー、mssqlサーバーに接続しています。

Sqlalchemy0.5はフィールドに使用DATETIMEsqlalchemy.Date()ます。

現在、Sqlalchemy 0.6はを使用DATEしていますが、SQLServer2000にはタイプがありませんDATE。sqlalchemy 0.6方言DATETIMEのデフォルトにするにはどうすればよいですか?sqlalchemy.Date()mssql+pyodbc

できるだけきれいに保ちたいです。

問題を再現するためのコードは次のとおりです。

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

engine = create_engine(
    'mssql+pyodbc://sa:sa@myserver/mydb?driver=FreeTDS')

m = MetaData(bind=engine)

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

そして、これが私が得ているトレースバックです:

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' ()
4

3 に答える 3

0

この状況は、sqlalchemyによって適切に処理されるはずです。MSSQL-日付/時刻の処理を参照してください。

これを処理する実装の抜粋でもあります(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_)

私の提案は、コードをデバッグして、これMSTypeCompilerが使用されているかどうか、そしてメソッドにヒットしたかどうかを確認することですvisit_date(...)

于 2010-06-10T08:15:08.780 に答える
0

私はそれを手に入れました-私の構成は間違っていました。

TDSプロトコルのバージョン7.0または8.0を使用するようにfreetdsを構成する必要があることがわかりました。デフォルトでは4.2を使用します。これは、MS SQL Serverのバージョンをクエリするときに奇妙な結果をもたらし、質問で説明したように、SQLAlchemyの動作を混乱させます。

ファイルに正しく設定しましたfreetds.confが、ファイルで定義されたDSNを使用した場合にのみ解析され、質問の例のように接続文字列を使用していたため、このファイルは読み取られませんでした。

ここでTDSVER説明するように変数を設定すると、問題が解決しました。

于 2010-06-10T22:56:22.547 に答える
0

移行はどうですか!!?

私はmssqlsucksを使用して同じボートにいます。これが私の解決策です。

構成

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

私のinit.py(アンダーバーはどこにありますか?)

私は非常に多くのエンコーディングの問題を抱えていました、私はこれをすることになりました、そしてそれはうまくいくようです。あなたが最終的に何をしたのか見てみたいです。

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)
于 2014-06-04T22:48:48.583 に答える