2010-06-08 3 views
1

나는 리눅스 우분투 10.04에서 FreeTDS ODBC 드라이버를 통해 pyodbc를 통해 mssql 서버에 연결합니다.mssql을 사용하여 0.6 마이그레이션에서 sqlalchemy 날짜 유형

Sqlalchemy 0.5는 sqlalchemy.Date() 필드에 DATETIME을 사용합니다.

이제 SQL Sqlalchemy 0.6은 DATE을 사용하지만 SQL Server 2000에는 DATE 형식이 없습니다. sqlalchemy에서 sqlalchemy.Date()의 기본값으로 DATETIME을 만들 수 있습니까? 012 mssql+pyodbc dialect?

가능한 한 깨끗하게 유지하고 싶습니다. 여기

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

그리고

내가지고있어 역 추적입니다 :이 상황이 제대로 SQLAlchemy의 처리하도록되어

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

답변

0

알겠습니다. 구성이 잘못되었습니다.

freetds를 구성하여 버전 7.0 또는 8.0의 TDS 프로토콜을 사용하도록 설정해야한다고 밝혀졌습니다. 기본적으로이 함수는 4.2를 사용하여 MS SQL Server 버전을 쿼리 할 때 이상한 결과를 만들어 내 질문에서 설명한대로 SQLAlchemy를 혼동스럽게합니다.

정확하게 freetds.conf 파일에 설정했지만이 파일은 파일에 정의 된 DSN을 사용할 때만 구문 분석되며이 예제에서와 같이 연결 문자열을 사용했기 때문에이 파일을 읽지 못했습니다. 문제.

TDSVER 변수를 설정하면 here이 문제를 해결했습니다.

0

다음은 문제를 재현하는 코드입니다. MS SQL - Date/Time Handling을 참조하십시오.

또한이 처리 구현의 추출물 (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(...) 방법을 공격합니다.

0

어떻게 이전을하고 있습니까 !!?

나는 mssqlsucks를 사용하여 같은 보트에 있습니다. 여기 내 해결책이 있습니다.

설정

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

초기화 평은

내가 너무 많은 인코딩에 문제가 있었다, 내가이 일을 결국 (여기서?를 언더을이다), 작동하는 것 같다. 드디어 네가 한 일을보고 싶다.

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) 
관련 문제