我正在为我正在开发的应用程序创建一个安装脚本,需要在PHP中动态创建数据库.我已经有了它来创建数据库,但现在我需要加载几个.sql文件.我曾打算一次打开文件和mysql_query一行 - 直到我查看模式文件并意识到它们不是每行一个查询.
那么,我如何从PHP中加载一个sql文件(如phpMyAdmin的import命令)?
我*.sql在创建新的网站数据库时使用了两个文件.第一个文件创建所有表.第二个文件填充一些默认记录.我想从PHP执行这些文件.我也使用Zend_Framework,如果这将有助于实现这一目标.
附加信息
解
使用shell_exec()......
$command = 'mysql'
. ' --host=' . $vals['db_host']
. ' --user=' . $vals['db_user']
. ' --password=' . $vals['db_pass']
. ' --database=' . $vals['db_name']
. ' --execute="SOURCE ' . $script_path
;
$output1 = shell_exec($command . '/site_db.sql"');
$output2 = shell_exec($command . '/site_structure.sql"');
Run Code Online (Sandbox Code Playgroud)
...我从来没有得到有用的输出,但在另一个线程上遵循一些建议,最后让它全部工作.我切换到命令的格式,而不是执行文件.--option=value--execute="SOURCE ..."<
此外,我从来没有得到shell_exec()和和之间的差异的良好解释exec().
所以我有一个需要使用mysql_query()加载的SQL转储文件.不幸的是,用它执行多个查询是不可能的.
- >不能假设安装了mysql命令行客户端(mysql --help) - 用于直接加载SQL文件
- >不能假设安装了mysqli扩展
/* contents of dump.sql, including comments */
DELETE FROM t3 WHERE body = 'some text; with semicolons; scattered; throughout';
DELETE FROM t2 WHERE name = 'hello';
DELETE FROM t1 WHERE id = 1;
Run Code Online (Sandbox Code Playgroud)
下面的explode()不起作用,因为某些转储内容的值包含分号.
$sql = explode(';', file_get_contents('dump.sql'));
foreach ($sql as $key => $val) {
mysql_query($val);
}
Run Code Online (Sandbox Code Playgroud)
在不修改转储文件的情况下加载SQL的最佳方法是什么?
基本上我想从 Postgres 中的 SQL 文件执行一个 SQL 文件。
mysql 的类似问题:是否可以从另一个 sql 脚本中的存储过程调用 sql 脚本?
为什么?
因为我在一个项目中有 2 个数据文件,我希望有一行可以被注释/取消注释以加载第二个文件。
说明: 我想从 A.SQL 调用 B.SQL
说明 2: 这是针对使用 hibernate 从初始 SQL 文件 (A.SQL) 创建数据库的 Spring 项目。
经过进一步思考,似乎我可能不得不从 java/string/hibernate 处理这个问题。
下面是配置文件:
spring.datasource.url=jdbc:postgresql://localhost:5432/dbname
spring.datasource.username=postgres
spring.datasource.password=root
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.data=classpath:db/migration/postgres/data.sql
spring.jpa.hibernate.ddl-auto=create
Run Code Online (Sandbox Code Playgroud) 我有以下几行代码:
sql = "source C:\\My Dropbox\\workspace\\projects\\hosted_inv\\create_site_db.sql"
cursor.execute (sql)
Run Code Online (Sandbox Code Playgroud)
当我执行我的程序时,我收到以下错误:
错误1064:您的SQL语法中有错误; 查看与您的MySQL服务器版本对应的手册,以便在第1行'source C:\ My Dropbox\workspace\projects\hosted_inv\create_site_db.sql'附近使用正确的语法
现在我可以将以下内容复制并发送到mysql作为查询:
source C:\\My Dropbox\\workspace\\projects\\hosted_inv\\create_site_db.sql
Run Code Online (Sandbox Code Playgroud)
它完美无缺.当我检查查询日志以查找我的脚本执行的查询时,它显示我的查询如下:
source C:\\My Dropbox\\workspace\\projects\\hosted_inv\\create_site_db.sql
Run Code Online (Sandbox Code Playgroud)
但是,当我手动粘贴并执行时,整个create_site_db.sql在查询日志中展开,并显示该文件中的所有sql查询.
我在这里错过了mysqldb如何查询的内容吗?我遇到了限制吗?我的目标是运行一个sql脚本来创建模式结构,但我不想在shell进程中调用mysql来获取sql文件.
有什么想法吗?谢谢!