Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法使用SQL Server使用SQLAlchemy创建数据库_Python_Sql Server_Sqlalchemy_Pyodbc - Fatal编程技术网

Python 无法使用SQL Server使用SQLAlchemy创建数据库

Python 无法使用SQL Server使用SQLAlchemy创建数据库,python,sql-server,sqlalchemy,pyodbc,Python,Sql Server,Sqlalchemy,Pyodbc,请注意,我一直在尝试使用SQLAlchemy创建一个新的数据库,但在尝试使用laravel和vagrant时出现了许多错误。谢天谢地,我已经能够使用pyodbc创建一个新的数据库,但最终我希望通过SQLAlchemy完成所有工作 这是在此时使用pyodbc创建新数据库的代码: for tagList in myTagList: conn = pyodbc.connect("driver={SQL Server Native Client 11.0};server=loca

请注意,我一直在尝试使用SQLAlchemy创建一个新的数据库,但在尝试使用laravel和vagrant时出现了许多错误。谢天谢地,我已经能够使用pyodbc创建一个新的数据库,但最终我希望通过SQLAlchemy完成所有工作

这是在此时使用pyodbc创建新数据库的代码:

    for tagList in myTagList:
        conn = pyodbc.connect("driver={SQL Server Native Client 11.0};server=localhost,2433; database=master; UID=myUser;PWD=myUser2", autocommit=True) 
        conn.execute('CREATE DATABASE ' + tagList["job"].jobNumber)
我将如何改变它以与SQLAlchemy一起工作?目前,我已经查看了许多链接,如和,但它似乎与postgresql一起工作,但与SQL Server无关:

添加对创建数据库的支持(请参阅):

在这一行
如果数据库不存在(fsDatabaseEngine.url):
接收:

    self.__connect(first_connect_check=True)
  File "C:\Python27\lib\site-packages\sqlalchemy\pool\base.py", line 639, in __connect
    connection = pool._invoke_creator(self)
  File "C:\Python27\lib\site-packages\sqlalchemy\engine\strategies.py", line 114, in connect
    return dialect.connect(*cargs, **cparams)
  File "C:\Python27\lib\site-packages\sqlalchemy\engine\default.py", line 482, in connect
    return self.dbapi.connect(*cargs, **cparams)
sqlalchemy.exc.InterfaceError: (pyodbc.InterfaceError) ('28000', u'[28000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Login failed for user \'myUser\'. (18456) (SQLDriverConnect); [28000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Cannot open database "MyDB00001" requested by the login. The login failed. (4060); [28000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Login failed for user \'myUser\'. (18456); [28000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Cannot open database "MyDB00001" requested by the login. The login failed. (4060)')
(Background on this error at: http://sqlalche.me/e/rvf5)

-----

C:\Python27\lib\site-packages\sqlalchemy\connectors\pyodbc.py:79: SAWarning: No driver name specified; this is expected by PyODBC when using DSN-less connections
  "No driver name specified; "

-----

#Save historical data into new MyDB000N database
for tagList in myTagList:
    # fsDatabaseEngine = create_engine('mssql://mssql@localhost:2433/' + tagList["job"].jobNumber + '?driver=SQL+Server+Native+Client+11.0?trusted_connection=yes')
    # if not database_exists(fsDatabaseEngine.url):
    create_database('mssql://mssql@localhost:2433/' + tagList["job"].jobNumber)
    #print(database_exists(fsDatabaseEngine.url))

  File "C:\Python27\lib\site-packages\sqlalchemy\engine\default.py", line 482, in connect
    return self.dbapi.connect(*cargs, **cparams)
sqlalchemy.exc.InterfaceError: (pyodbc.InterfaceError) ('IM002', u'[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)')
(Background on this error at: http://sqlalche.me/e/rvf5)
PS Projects>

-----

#Save historical data into new MyDB000N database
for tagList in myTagList:
    # fsDatabaseEngine = create_engine('mssql://mssql@localhost:2433/' + tagList["job"].jobNumber + '?driver=SQL+Server+Native+Client+11.0?trusted_connection=yes')
    # if not database_exists(fsDatabaseEngine.url):
    create_database('mssql://myUser:myUser2@localhost:2433/' + tagList["job"].jobNumber+ '?driver=SQL+Server+Native+Client+11.0?trusted_connection=yes')
    #print(database_exists(fsDatabaseEngine.url))

  File "C:\Python27\lib\site-packages\sqlalchemy\engine\base.py", line 1246, in _execute_context
    cursor, statement, parameters, context
  File "C:\Python27\lib\site-packages\sqlalchemy\engine\default.py", line 581, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('42000', u'[42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]CREATE DATABASE statement not allowed within multi-statement transaction. (226) (SQLExecDirectW)')
[SQL: CREATE DATABASE [MyDB00001]]
(Background on this error at: http://sqlalche.me/e/f405)
PS Projects>

-----

#Save historical data into new MyDB000N database
for tagList in myTagList:
    with create_engine(
        'mssql://mssql',
        isolation_level="AUTOCOMMIT"
        ).connect() as connection:
            connection.execute('CREATE DATABASE ' + tagList["job"].jobNumber)
    # if not database_exists(fsDatabaseEngine.url):
    #create_database('mssql://myUser:myUser2@localhost:2433/' + tagList["job"].jobNumber)
    #print(database_exists(fsDatabaseEngine.url))

  File "C:\Python27\lib\site-packages\sqlalchemy\engine\default.py", line 482, in connect
    return self.dbapi.connect(*cargs, **cparams)
sqlalchemy.exc.InterfaceError: (pyodbc.InterfaceError) ('IM002', u'[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)')
(Background on this error at: http://sqlalche.me/e/rvf5)
PS Projects>

-----

#Save historical data into new MyDB000N database
for tagList in myTagList:
    session.execute('CREATE DATABASE ' + tagList["job"].jobNumber)

  File "C:\Python27\lib\site-packages\sqlalchemy\engine\default.py", line 581, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('42000', u'[42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]CREATE DATABASE statement not allowed within multi-statement transaction. (226) (SQLExecDirectW)')
[SQL: CREATE DATABASE MyDB00001]
(Background on this error at: http://sqlalche.me/e/f405)
PS Projects>

-----

#Save historical data into new MyDB000N database
for tagList in myTagList:
    conn = pyodbc.connect("driver={SQL Server};server=ubuntu-bionic; database=master; trusted_connection=true",
                      autocommit=True)

Exception has occurred: OperationalError
('08001', u'[08001] [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server does not exist or access denied. (17) (SQLDriverConnect); [08001] [Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionOpen (Connect()). (53)')
  File "Projects\interesting_data.py", line 81, in <module>
    autocommit=True)

-----

#Save historical data into new MyDB000N database
for tagList in myTagList:
    conn = pyodbc.connect("driver={SQL Server Native Client 10.0};server=localhost,2433; database=master; trusted_connection=true", autocommit=True)

Exception has occurred: InterfaceError
('IM002', u'[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)')
  File "Projects\interesting_data.py", line 80, in <module>
    conn = pyodbc.connect("driver={SQL Server Native Client 10.0};server=localhost,2433; database=master; trusted_connection=true", autocommit=True)

-----    

#Save historical data into new MyDB000N database
for tagList in myTagList:
    conn = pyodbc.connect("driver={SQL Server Native Client 11.0};server=localhost,2433; database=master; trusted_connection=true", autocommit=True)

Exception has occurred: OperationalError
('08001', u"[08001] [Microsoft][SQL Server Native Client 11.0]Invalid value specified for connection string attribute 'trusted_connection' (0) (SQLDriverConnect)")
  File "Projects\interesting_data.py", line 80, in <module>
    conn = pyodbc.connect("driver={SQL Server Native Client 11.0};server=localhost,2433; database=master; trusted_connection=true", autocommit=True)

-----

#Save historical data into new MyDB000N database
for tagList in myTagList:
    conn = pyodbc.connect("driver={SQL Server Native Client 11.0};server=localhost,2433; database=master; trusted_connection=yes", autocommit=True)

Exception has occurred: Error
('HY000', u'[HY000] [Microsoft][SQL Server Native Client 11.0]SQL Server Network Interfaces: No credentials are available in the security package\r\n (-2146893042) (SQLDriverConnect); [HY000] [Microsoft][SQL Server Native Client 11.0]Cannot generate SSPI context (-2146893042); [HY000] [Microsoft][SQL Server Native Client 11.0]SQL Server Network Interfaces: No credentials are available in the security package\r\n (-2146893042); [HY000] [Microsoft][SQL Server Native Client 11.0]Cannot generate SSPI context (-2146893042)')
  File "Projects\interesting_data.py", line 80, in <module>
    conn = pyodbc.connect("driver={SQL Server Native Client 11.0};server=localhost,2433; database=master; trusted_connection=yes", autocommit=True)
其中:

Exception has occurred: AttributeError
'module' object has no attribute 'parse'
  File "C:\Projects\interesting_data.py", line 82, in <module>
    params = urllib.parse.quote_plus("driver={SQL Server Native Client 11.0};server=localhost,2433; database=master; UID=myUser;PWD=myUser2")
谢谢大家!

更新2:

为了专注于解决方案,我在研究中发现了使用
postgres://postgres
…,但最终在我的情况下,我需要更改
mssql://myUser
mssql+pyodbc://myUser...

根据客户的评论,以下是解决方案:

#Save historical data into new MyDB000N database
for tagList in rdTagList:
    fsDatabaseEngine = create_engine('mssql+pyodbc://myUser:myUser2@localhost:2433/' + tagList["job"].jobNumber + '?driver=SQL+Server+Native+Client+11.0?trusted_connection=yes')
    if not database_exists(fsDatabaseEngine.url):
        create_database(fsDatabaseEngine.url)
    print(database_exists(fsDatabaseEngine.url))

conn.execute('CREATE DATABASE'+tagList[“job”].jobNumber)
这条语句非常容易注入。如果需要创建数据库,则应传递参数并使用带有
QUOTENAME
DECLARE@create-nvarchar(275)的动态语句;设置@Create=N'Create DATABASE'+QUOTENAME(@Db)+N';';EXEC sp_executesql@Create标记列表[“job”]。jobNumber是我从python脚本的其他地方获得的,因此我不知道它是如何对SQL注入开放的,因为这些是我从本地数据库获得的值。另外,您正在向我展示如何用SQL而不是python解决注入问题,这是没有帮助的。如果您
print(fsDatabaseEngine.url)
它是正确的连接字符串吗?错误消息表明登录凭据或数据库名称一定是错误的。好吧,我不确定我怎么会错过它--它现在突然工作了!。如果我打印打印(fsDatabaseEngine.url),它将为我提供正确的连接字符串。如果你发布@snakecharmerb,我会将其标记为答案。非常感谢。@user8128167是有帮助的,因为“CREATE DATABASE@Parameter;”之类的语法无效,我假设您知道如何对Python SQL语句进行参数化。您不安全地注入的事实说明您不知道如何安全地注入。
Exception has occurred: AttributeError
'module' object has no attribute 'parse'
  File "C:\Projects\interesting_data.py", line 82, in <module>
    params = urllib.parse.quote_plus("driver={SQL Server Native Client 11.0};server=localhost,2433; database=master; UID=myUser;PWD=myUser2")
#Save historical data into new MyDB000N database
for tagList in rdTagList:
    fsDatabaseEngine = create_engine('mssql+pyodbc://myUser:myUser2@localhost:2433/' + tagList["job"].jobNumber + '?driver=SQL+Server+Native+Client+11.0?trusted_connection=yes')
    if not database_exists(fsDatabaseEngine.url):
        create_database(fsDatabaseEngine.url)
    print(database_exists(fsDatabaseEngine.url))
#Save historical data into new MyDB000N database
for tagList in rdTagList:
    fsDatabaseEngine = create_engine('mssql+pyodbc://myUser:myUser2@localhost:2433/' + tagList["job"].jobNumber + '?driver=SQL+Server+Native+Client+11.0?trusted_connection=yes')
    if not database_exists(fsDatabaseEngine.url):
        create_database(fsDatabaseEngine.url)
    print(database_exists(fsDatabaseEngine.url))